]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
New upstream version 48~beta
authorJeremy Bícha <jeremy.bicha@canonical.com>
Wed, 5 Feb 2025 12:53:09 +0000 (07:53 -0500)
committerJeremy Bícha <jeremy.bicha@canonical.com>
Wed, 5 Feb 2025 12:53:09 +0000 (07:53 -0500)
18 files changed:
1  2 
data/theme/gnome-shell-dark.css
data/theme/gnome-shell-high-contrast.css
data/theme/gnome-shell-light.css
subprojects/jasmine-gjs/NEWS.md
subprojects/jasmine-gjs/bin/jasmine-runner.in
subprojects/jasmine-gjs/bin/jasmine.in
subprojects/jasmine-gjs/debian/changelog
subprojects/jasmine-gjs/debian/control
subprojects/jasmine-gjs/jasmine-gjs.spec
subprojects/jasmine-gjs/lib/jasmine.js
subprojects/jasmine-gjs/lib/update-jasmine.sh
subprojects/jasmine-gjs/meson.build
subprojects/jasmine-gjs/release-checklist.md
subprojects/jasmine-gjs/src/consoleReporter.js
subprojects/jasmine-gjs/test/0_your_first_suite.js
subprojects/jasmine-gjs/test/commandSpec.js
subprojects/jasmine-gjs/test/custom_matcher.js
subprojects/jasmine-gjs/test/jasmineBootSpec.js

index f0f9facb0ba912e10cde8c38810ace024d40f5f2,0000000000000000000000000000000000000000..ddd76575bc830dadc2c4b0290f86b8168be2cc64
mode 100644,000000..100644
--- /dev/null
@@@ -1,3236 -1,0 +1,3206 @@@
-   background-color: st-mix(#ffffff, #353535, 9%); }
 +/* This stylesheet is generated, DO NOT EDIT */
 +/* Copyright 2009, 2015 Red Hat, Inc.
 + *
 + * Portions adapted from Mx's data/style/default.css
 + *   Copyright 2009 Intel Corporation
 + *
 + * This program is free software; you can redistribute it and/or modify it
 + * under the terms and conditions of the GNU Lesser General Public License,
 + * version 2.1, as published by the Free Software Foundation.
 + *
 + * This program is distributed in the hope it will be useful, but WITHOUT ANY
 + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 + * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
 + * more details.
 + *
 + * You should have received a copy of the GNU Lesser General Public License
 + * along with this program; if not, write to the Free Software Foundation,
 + * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
 + */
 +/* Global Values */
 +stage {
 +  font-size: 1em;
 +  color: #ffffff; }
 +
 +/* Common Stylings */
 +#dash .dash-item-container .show-apps,
 +#dash .dash-item-container .overview-tile,
 +#dash .dash-item-container .grid-search-result {
 +  background: none;
 +  box-shadow: none;
 +  border: none;
 +  border-radius: 0;
 +  padding: 0;
 +  margin: 0; }
 +
 +.app-folder-dialog .overview-tile, .app-folder-dialog .grid-search-result, .app-folder, .overview-tile, .grid-search-result, #dash .dash-item-container .show-apps .overview-icon,
 +#dash .dash-item-container .overview-tile .overview-icon,
 +#dash .dash-item-container .grid-search-result .overview-icon, .list-search-result, .search-provider-icon, .switcher-list .item-box, .audio-device-selection-dialog .audio-selection-box .audio-selection-device {
 +  border-radius: 16px;
 +  padding: 6px;
 +  spacing: 6px;
 +  text-align: center;
 +  transition-duration: 100ms; }
 +
 +.login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item, .login-dialog-not-listed-button, .unlock-dialog .button,
 +.unlock-dialog .icon-button,
 +.unlock-dialog .message .message-header .message-expand-button,
 +.message .message-header .unlock-dialog .message-expand-button,
 +.unlock-dialog .message .message-header .message-close-button,
 +.message .message-header .unlock-dialog .message-close-button,
 +.unlock-dialog .screenshot-ui-show-pointer-button, #LookingGlassDialog .notebook-tab, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button, #LookingGlassDebugFlags .lg-debug-flag-button, #LookingGlassPropertyInspector .lg-obj-inspector-close-button,
 +#LookingGlassPropertyInspector .lg-obj-inspector-button, #LookingGlassDialog > #Toolbar .lg-toolbar-button, .icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .message .message-header .message-expand-button,
 +.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button, .button {
 +  border-radius: 8px;
 +  padding: 3px 24px;
 +  font-weight: bold;
 +  transition: border-width 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), box-shadow 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94); }
 +
 +.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .screenshot-ui-show-pointer-button, .message .message-header .message-expand-button,
 +.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button, .button {
 +  color: #ffffff;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 9%), 5%); }
++  background-color: st-mix(#ffffff, #36363a, 9%); }
 +  .icon-button:focus, .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus, .screenshot-ui-show-pointer-button:focus, .message .message-header .message-expand-button:focus,
 +  .message .message-header .message-close-button:focus, .calendar .calendar-month-header .pager-button:focus, .button:focus {
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 4%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#ffffff, #36363a, 9%), 5%); }
 +    .icon-button:focus:hover, .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .message .message-header .message-expand-button:focus:hover,
 +    .message .message-header .message-close-button:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .button:focus:hover {
-     background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 4%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #36363a, 9%), 4%), 5%); }
 +  .icon-button:hover, .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover, .screenshot-ui-show-pointer-button:hover, .message .message-header .message-expand-button:hover,
 +  .message .message-header .message-close-button:hover, .calendar .calendar-month-header .pager-button:hover, .button:hover {
 +    color: #ffffff;
-     background-color: st-darken(st-mix(#ffffff, #353535, 9%), 3%); }
++    background-color: st-lighten(st-mix(#ffffff, #36363a, 9%), 4%); }
 +  .icon-button:insensitive, .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive, .screenshot-ui-show-pointer-button:insensitive, .message .message-header .message-expand-button:insensitive,
 +  .message .message-header .message-close-button:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .button:insensitive {
 +    color: st-transparentize(#ffffff, 0.5);
-     background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 9%); }
++    background-color: st-darken(st-mix(#ffffff, #36363a, 9%), 3%); }
 +  .icon-button:selected, .login-dialog-button.cancel-button:selected, .login-dialog-button.switch-user-button:selected, .login-dialog-button.login-dialog-session-list-button:selected, .screenshot-ui-show-pointer-button:selected, .message .message-header .message-expand-button:selected,
 +  .message .message-header .message-close-button:selected, .calendar .calendar-month-header .pager-button:selected, .button:selected, .icon-button:active, .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active, .screenshot-ui-show-pointer-button:active, .message .message-header .message-expand-button:active,
 +  .message .message-header .message-close-button:active, .calendar .calendar-month-header .pager-button:active, .button:active {
 +    color: #ffffff;
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 9%), 4%); }
++    background-color: st-lighten(st-mix(#ffffff, #36363a, 9%), 9%); }
 +    .icon-button:selected:hover, .login-dialog-button.cancel-button:selected:hover, .login-dialog-button.switch-user-button:selected:hover, .login-dialog-button.login-dialog-session-list-button:selected:hover, .screenshot-ui-show-pointer-button:selected:hover, .message .message-header .message-expand-button:selected:hover,
 +    .message .message-header .message-close-button:selected:hover, .calendar .calendar-month-header .pager-button:selected:hover, .button:selected:hover, .icon-button:active:hover, .login-dialog-button.cancel-button:active:hover, .login-dialog-button.switch-user-button:active:hover, .login-dialog-button.login-dialog-session-list-button:active:hover, .screenshot-ui-show-pointer-button:active:hover, .message .message-header .message-expand-button:active:hover,
 +    .message .message-header .message-close-button:active:hover, .calendar .calendar-month-header .pager-button:active:hover, .button:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 9%), 5%); }
++      background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 9%), 4%); }
 +    .icon-button:selected:focus, .login-dialog-button.cancel-button:selected:focus, .login-dialog-button.switch-user-button:selected:focus, .login-dialog-button.login-dialog-session-list-button:selected:focus, .screenshot-ui-show-pointer-button:selected:focus, .message .message-header .message-expand-button:selected:focus,
 +    .message .message-header .message-close-button:selected:focus, .calendar .calendar-month-header .pager-button:selected:focus, .button:selected:focus, .icon-button:active:focus, .login-dialog-button.cancel-button:active:focus, .login-dialog-button.switch-user-button:active:focus, .login-dialog-button.login-dialog-session-list-button:active:focus, .screenshot-ui-show-pointer-button:active:focus, .message .message-header .message-expand-button:active:focus,
 +    .message .message-header .message-close-button:active:focus, .calendar .calendar-month-header .pager-button:active:focus, .button:active:focus {
-     background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 8%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #36363a, 9%), 9%), 5%); }
 +  .icon-button:checked, .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked, .screenshot-ui-show-pointer-button:checked, .message .message-header .message-expand-button:checked,
 +  .message .message-header .message-close-button:checked, .calendar .calendar-month-header .pager-button:checked, .button:checked {
 +    color: #ffffff;
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 4%); }
++    background-color: st-lighten(st-mix(#ffffff, #36363a, 9%), 8%); }
 +    .icon-button:checked:hover, .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .message .message-header .message-expand-button:checked:hover,
 +    .message .message-header .message-close-button:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .button:checked:hover {
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 9%); }
++      background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 8%), 4%); }
 +    .icon-button:checked:active, .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active, .screenshot-ui-show-pointer-button:checked:active, .message .message-header .message-expand-button:checked:active,
 +    .message .message-header .message-close-button:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .button:checked:active {
-   background-color: #353535; }
++      background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 8%), 9%); }
 +
 +.calendar .calendar-day-heading, .calendar .calendar-day, .calendar .calendar-month-header .calendar-month-label, .icon-button.flat, .flat.login-dialog-button.cancel-button, .flat.login-dialog-button.switch-user-button, .flat.login-dialog-button.login-dialog-session-list-button, .flat.screenshot-ui-show-pointer-button, .message .message-header .flat.message-expand-button,
 +.message .message-header .flat.message-close-button, .calendar .calendar-month-header .pager-button, .button.flat {
 +  color: #ffffff;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); }
++  background-color: #36363a; }
 +  .calendar .calendar-day-heading:focus, .calendar .calendar-day:focus, .calendar .calendar-month-header .calendar-month-label:focus, .icon-button.flat:focus, .flat.login-dialog-button.cancel-button:focus, .flat.login-dialog-button.switch-user-button:focus, .flat.login-dialog-button.login-dialog-session-list-button:focus, .flat.screenshot-ui-show-pointer-button:focus, .message .message-header .flat.message-expand-button:focus,
 +  .message .message-header .flat.message-close-button:focus, .calendar .calendar-month-header .pager-button:focus, .button.flat:focus {
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(54, 54, 58, 0.25), 5%); }
 +    .calendar .calendar-day-heading:focus:hover, .calendar .calendar-day:focus:hover, .calendar .calendar-month-header .calendar-month-label:focus:hover, .icon-button.flat:focus:hover, .flat.login-dialog-button.cancel-button:focus:hover, .flat.login-dialog-button.switch-user-button:focus:hover, .flat.login-dialog-button.login-dialog-session-list-button:focus:hover, .flat.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .flat.message-expand-button:focus:hover,
 +    .message .message-header .flat.message-close-button:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .button.flat:focus:hover {
-     background-color: st-lighten(#353535, 7%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#36363a, 7%), 5%); }
 +  .calendar .calendar-day-heading:hover, .calendar .calendar-day:hover, .calendar .calendar-month-header .calendar-month-label:hover, .icon-button.flat:hover, .flat.login-dialog-button.cancel-button:hover, .flat.login-dialog-button.switch-user-button:hover, .flat.login-dialog-button.login-dialog-session-list-button:hover, .flat.screenshot-ui-show-pointer-button:hover, .message .message-header .flat.message-expand-button:hover,
 +  .message .message-header .flat.message-close-button:hover, .calendar .calendar-month-header .pager-button:hover, .button.flat:hover {
 +    color: #ffffff;
-     background-color: #353535; }
++    background-color: st-lighten(#36363a, 7%); }
 +  .calendar .calendar-day-heading:insensitive, .calendar .calendar-day:insensitive, .calendar .calendar-month-header .calendar-month-label:insensitive, .icon-button.flat:insensitive, .flat.login-dialog-button.cancel-button:insensitive, .flat.login-dialog-button.switch-user-button:insensitive, .flat.login-dialog-button.login-dialog-session-list-button:insensitive, .flat.screenshot-ui-show-pointer-button:insensitive, .message .message-header .flat.message-expand-button:insensitive,
 +  .message .message-header .flat.message-close-button:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .button.flat:insensitive {
 +    color: st-transparentize(#ffffff, 0.5);
-     background-color: st-lighten(#353535, 9%); }
++    background-color: #36363a; }
 +  .calendar .calendar-day-heading:selected, .calendar .calendar-day:selected, .calendar .calendar-month-header .calendar-month-label:selected, .icon-button.flat:selected, .flat.login-dialog-button.cancel-button:selected, .flat.login-dialog-button.switch-user-button:selected, .flat.login-dialog-button.login-dialog-session-list-button:selected, .flat.screenshot-ui-show-pointer-button:selected, .message .message-header .flat.message-expand-button:selected,
 +  .message .message-header .flat.message-close-button:selected, .calendar .calendar-month-header .pager-button:selected, .button.flat:selected, .calendar .calendar-day-heading:active, .calendar .calendar-day:active, .calendar .calendar-month-header .calendar-month-label:active, .icon-button.flat:active, .flat.login-dialog-button.cancel-button:active, .flat.login-dialog-button.switch-user-button:active, .flat.login-dialog-button.login-dialog-session-list-button:active, .flat.screenshot-ui-show-pointer-button:active, .message .message-header .flat.message-expand-button:active,
 +  .message .message-header .flat.message-close-button:active, .calendar .calendar-month-header .pager-button:active, .button.flat:active {
 +    color: #ffffff;
-       background-color: st-lighten(st-lighten(#353535, 9%), 7%); }
++    background-color: st-lighten(#36363a, 9%); }
 +    .calendar .calendar-day-heading:selected:hover, .calendar .calendar-day:selected:hover, .calendar .calendar-month-header .calendar-month-label:selected:hover, .icon-button.flat:selected:hover, .flat.login-dialog-button.cancel-button:selected:hover, .flat.login-dialog-button.switch-user-button:selected:hover, .flat.login-dialog-button.login-dialog-session-list-button:selected:hover, .flat.screenshot-ui-show-pointer-button:selected:hover, .message .message-header .flat.message-expand-button:selected:hover,
 +    .message .message-header .flat.message-close-button:selected:hover, .calendar .calendar-month-header .pager-button:selected:hover, .button.flat:selected:hover, .calendar .calendar-day-heading:active:hover, .calendar .calendar-day:active:hover, .calendar .calendar-month-header .calendar-month-label:active:hover, .icon-button.flat:active:hover, .flat.login-dialog-button.cancel-button:active:hover, .flat.login-dialog-button.switch-user-button:active:hover, .flat.login-dialog-button.login-dialog-session-list-button:active:hover, .flat.screenshot-ui-show-pointer-button:active:hover, .message .message-header .flat.message-expand-button:active:hover,
 +    .message .message-header .flat.message-close-button:active:hover, .calendar .calendar-month-header .pager-button:active:hover, .button.flat:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); }
++      background-color: st-lighten(st-lighten(#36363a, 9%), 7%); }
 +    .calendar .calendar-day-heading:selected:focus, .calendar .calendar-day:selected:focus, .calendar .calendar-month-header .calendar-month-label:selected:focus, .icon-button.flat:selected:focus, .flat.login-dialog-button.cancel-button:selected:focus, .flat.login-dialog-button.switch-user-button:selected:focus, .flat.login-dialog-button.login-dialog-session-list-button:selected:focus, .flat.screenshot-ui-show-pointer-button:selected:focus, .message .message-header .flat.message-expand-button:selected:focus,
 +    .message .message-header .flat.message-close-button:selected:focus, .calendar .calendar-month-header .pager-button:selected:focus, .button.flat:selected:focus, .calendar .calendar-day-heading:active:focus, .calendar .calendar-day:active:focus, .calendar .calendar-month-header .calendar-month-label:active:focus, .icon-button.flat:active:focus, .flat.login-dialog-button.cancel-button:active:focus, .flat.login-dialog-button.switch-user-button:active:focus, .flat.login-dialog-button.login-dialog-session-list-button:active:focus, .flat.screenshot-ui-show-pointer-button:active:focus, .message .message-header .flat.message-expand-button:active:focus,
 +    .message .message-header .flat.message-close-button:active:focus, .calendar .calendar-month-header .pager-button:active:focus, .button.flat:active:focus {
-     background-color: st-lighten(#353535, 8%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#36363a, 9%), 5%); }
 +  .calendar .calendar-day-heading:checked, .calendar .calendar-day:checked, .calendar .calendar-month-header .calendar-month-label:checked, .icon-button.flat:checked, .flat.login-dialog-button.cancel-button:checked, .flat.login-dialog-button.switch-user-button:checked, .flat.login-dialog-button.login-dialog-session-list-button:checked, .flat.screenshot-ui-show-pointer-button:checked, .message .message-header .flat.message-expand-button:checked,
 +  .message .message-header .flat.message-close-button:checked, .calendar .calendar-month-header .pager-button:checked, .button.flat:checked {
 +    color: #ffffff;
-       background-color: st-lighten(st-lighten(#353535, 8%), 7%); }
++    background-color: st-lighten(#36363a, 8%); }
 +    .calendar .calendar-day-heading:checked:hover, .calendar .calendar-day:checked:hover, .calendar .calendar-month-header .calendar-month-label:checked:hover, .icon-button.flat:checked:hover, .flat.login-dialog-button.cancel-button:checked:hover, .flat.login-dialog-button.switch-user-button:checked:hover, .flat.login-dialog-button.login-dialog-session-list-button:checked:hover, .flat.screenshot-ui-show-pointer-button:checked:hover, .message .message-header .flat.message-expand-button:checked:hover,
 +    .message .message-header .flat.message-close-button:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .button.flat:checked:hover {
-       background-color: st-lighten(st-lighten(#353535, 8%), 9%); }
++      background-color: st-lighten(st-lighten(#36363a, 8%), 7%); }
 +    .calendar .calendar-day-heading:checked:active, .calendar .calendar-day:checked:active, .calendar .calendar-month-header .calendar-month-label:checked:active, .icon-button.flat:checked:active, .flat.login-dialog-button.cancel-button:checked:active, .flat.login-dialog-button.switch-user-button:checked:active, .flat.login-dialog-button.login-dialog-session-list-button:checked:active, .flat.screenshot-ui-show-pointer-button:checked:active, .message .message-header .flat.message-expand-button:checked:active,
 +    .message .message-header .flat.message-close-button:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .button.flat:checked:active {
- .keyboard-brightness-level .button:checked, .quick-menu-toggle .quick-toggle-arrow:checked, .quick-toggle:checked, .calendar .calendar-day.calendar-today, .icon-button.default, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .default.screenshot-ui-show-pointer-button, .message .message-header .default.message-expand-button,
++      background-color: st-lighten(st-lighten(#36363a, 8%), 9%); }
 +
-   .keyboard-brightness-level .button:focus:checked, .quick-menu-toggle .quick-toggle-arrow:focus:checked, .quick-toggle:focus:checked, .calendar .calendar-day.calendar-today:focus, .icon-button.default:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .default.screenshot-ui-show-pointer-button:focus, .message .message-header .default.message-expand-button:focus,
++.keyboard-brightness-level .button:checked, .quick-toggle:checked, .calendar .calendar-day.calendar-today, .icon-button.default, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .default.screenshot-ui-show-pointer-button, .message .message-header .default.message-expand-button,
 +.message .message-header .default.message-close-button, .calendar .calendar-month-header .default.pager-button, .button.default {
 +  color: -st-accent-fg-color;
 +  background-color: -st-accent-color; }
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     box-shadow: inset 0 0 0 2px st-lighten(-st-accent-color, 15%) !important;
-     background-color: st-mix(-st-accent-color, -st-accent-color, 5%); }
-     .keyboard-brightness-level .button:focus:hover:checked, .quick-menu-toggle .quick-toggle-arrow:focus:hover:checked, .quick-toggle:focus:hover:checked, .calendar .calendar-day.calendar-today:focus:hover, .icon-button.default:focus:hover, .default.login-dialog-button.cancel-button:focus:hover, .default.login-dialog-button.switch-user-button:focus:hover, .default.login-dialog-button.login-dialog-session-list-button:focus:hover, .default.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .default.message-expand-button:focus:hover,
++  .keyboard-brightness-level .button:focus:checked, .quick-toggle:focus:checked, .calendar .calendar-day.calendar-today:focus, .icon-button.default:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .default.screenshot-ui-show-pointer-button:focus, .message .message-header .default.message-expand-button:focus,
 +  .message .message-header .default.message-close-button:focus, .calendar .calendar-month-header .default.pager-button:focus, .button.default:focus {
 +    color: -st-accent-fg-color;
-       background-color: st-mix(-st-accent-color, st-lighten(-st-accent-color, 4%), 5%); }
-   .keyboard-brightness-level .button:hover:checked, .quick-menu-toggle .quick-toggle-arrow:hover:checked, .quick-toggle:hover:checked, .calendar .calendar-day.calendar-today:hover, .icon-button.default:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .default.screenshot-ui-show-pointer-button:hover, .message .message-header .default.message-expand-button:hover,
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    box-shadow: inset 0 0 0 2px st-transparentize(st-lighten(-st-accent-color, 30%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), -st-accent-color, 5%); }
++    .keyboard-brightness-level .button:focus:hover:checked, .quick-toggle:focus:hover:checked, .calendar .calendar-day.calendar-today:focus:hover, .icon-button.default:focus:hover, .default.login-dialog-button.cancel-button:focus:hover, .default.login-dialog-button.switch-user-button:focus:hover, .default.login-dialog-button.login-dialog-session-list-button:focus:hover, .default.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .default.message-expand-button:focus:hover,
 +    .message .message-header .default.message-close-button:focus:hover, .calendar .calendar-month-header .default.pager-button:focus:hover, .button.default:focus:hover {
-   .keyboard-brightness-level .button:insensitive:checked, .quick-menu-toggle .quick-toggle-arrow:insensitive:checked, .quick-toggle:insensitive:checked, .calendar .calendar-day.calendar-today:insensitive, .icon-button.default:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .default.screenshot-ui-show-pointer-button:insensitive, .message .message-header .default.message-expand-button:insensitive,
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(-st-accent-color, 4%), 5%); }
++  .keyboard-brightness-level .button:hover:checked, .quick-toggle:hover:checked, .calendar .calendar-day.calendar-today:hover, .icon-button.default:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .default.screenshot-ui-show-pointer-button:hover, .message .message-header .default.message-expand-button:hover,
 +  .message .message-header .default.message-close-button:hover, .calendar .calendar-month-header .default.pager-button:hover, .button.default:hover {
 +    color: -st-accent-fg-color;
 +    background-color: st-lighten(-st-accent-color, 4%); }
-   .keyboard-brightness-level .button:active:checked, .quick-menu-toggle .quick-toggle-arrow:active:checked, .quick-toggle:active:checked, .calendar .calendar-day.calendar-today:active, .icon-button.default:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .default.screenshot-ui-show-pointer-button:active, .message .message-header .default.message-expand-button:active,
++  .keyboard-brightness-level .button:insensitive:checked, .quick-toggle:insensitive:checked, .calendar .calendar-day.calendar-today:insensitive, .icon-button.default:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .default.screenshot-ui-show-pointer-button:insensitive, .message .message-header .default.message-expand-button:insensitive,
 +  .message .message-header .default.message-close-button:insensitive, .calendar .calendar-month-header .default.pager-button:insensitive, .button.default:insensitive {
 +    color: st-transparentize(-st-accent-fg-color, 0.5);
 +    background-color: st-darken(-st-accent-color, 3%); }
-     .keyboard-brightness-level .button:active:hover:checked, .quick-menu-toggle .quick-toggle-arrow:active:hover:checked, .quick-toggle:active:hover:checked, .calendar .calendar-day.calendar-today:active:hover, .icon-button.default:active:hover, .default.login-dialog-button.cancel-button:active:hover, .default.login-dialog-button.switch-user-button:active:hover, .default.login-dialog-button.login-dialog-session-list-button:active:hover, .default.screenshot-ui-show-pointer-button:active:hover, .message .message-header .default.message-expand-button:active:hover,
++  .keyboard-brightness-level .button:active:checked, .quick-toggle:active:checked, .calendar .calendar-day.calendar-today:active, .icon-button.default:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .default.screenshot-ui-show-pointer-button:active, .message .message-header .default.message-expand-button:active,
 +  .message .message-header .default.message-close-button:active, .calendar .calendar-month-header .default.pager-button:active, .button.default:active {
 +    color: -st-accent-fg-color;
 +    background-color: st-lighten(-st-accent-color, 9%); }
-     .keyboard-brightness-level .button:active:focus:checked, .quick-menu-toggle .quick-toggle-arrow:active:focus:checked, .quick-toggle:active:focus:checked, .calendar .calendar-day.calendar-today:active:focus, .icon-button.default:active:focus, .default.login-dialog-button.cancel-button:active:focus, .default.login-dialog-button.switch-user-button:active:focus, .default.login-dialog-button.login-dialog-session-list-button:active:focus, .default.screenshot-ui-show-pointer-button:active:focus, .message .message-header .default.message-expand-button:active:focus,
++    .keyboard-brightness-level .button:active:hover:checked, .quick-toggle:active:hover:checked, .calendar .calendar-day.calendar-today:active:hover, .icon-button.default:active:hover, .default.login-dialog-button.cancel-button:active:hover, .default.login-dialog-button.switch-user-button:active:hover, .default.login-dialog-button.login-dialog-session-list-button:active:hover, .default.screenshot-ui-show-pointer-button:active:hover, .message .message-header .default.message-expand-button:active:hover,
 +    .message .message-header .default.message-close-button:active:hover, .calendar .calendar-month-header .default.pager-button:active:hover, .button.default:active:hover {
 +      background-color: st-lighten(st-lighten(-st-accent-color, 9%), 4%); }
-       background-color: st-mix(-st-accent-color, st-lighten(-st-accent-color, 9%), 5%); }
++    .keyboard-brightness-level .button:active:focus:checked, .quick-toggle:active:focus:checked, .calendar .calendar-day.calendar-today:active:focus, .icon-button.default:active:focus, .default.login-dialog-button.cancel-button:active:focus, .default.login-dialog-button.switch-user-button:active:focus, .default.login-dialog-button.login-dialog-session-list-button:active:focus, .default.screenshot-ui-show-pointer-button:active:focus, .message .message-header .default.message-expand-button:active:focus,
 +    .message .message-header .default.message-close-button:active:focus, .calendar .calendar-month-header .default.pager-button:active:focus, .button.default:active:focus {
-   background-color: #474747;
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(-st-accent-color, 9%), 5%); }
 +
 +.popup-sub-menu .popup-menu-item, .popup-menu-item {
 +  font-weight: normal;
 +  spacing: 6px;
 +  transition-duration: 100ms;
 +  padding: 9px 12px; }
 +
 +#LookingGlassExtensions .lg-extension, #LookingGlassWindows .lg-window, .calendar, .datemenu-today-button, .quick-toggle-menu, .message, .events-button,
 +.world-clocks-button,
 +.weather-button {
 +  border-radius: 12px;
 +  padding: 0.818em;
 +  margin: 4px;
-   background-color: #474747; }
++  background-color: #47474c;
 +  box-shadow: 0 1px 2px 0 transparent;
 +  border: 1px solid transparent; }
 +
 +.quick-toggle-menu, .message, .events-button,
 +.world-clocks-button,
 +.weather-button {
 +  color: #ffffff;
-     background-color: st-lighten(#474747, 4%); }
++  background-color: #47474c; }
 +  .quick-toggle-menu:hover, .message:hover, .events-button:hover,
 +  .world-clocks-button:hover,
 +  .weather-button:hover {
 +    color: #ffffff;
-     background-color: st-lighten(#474747, 9%); }
++    background-color: st-lighten(#47474c, 4%); }
 +  .quick-toggle-menu:active, .message:active, .events-button:active,
 +  .world-clocks-button:active,
 +  .weather-button:active {
 +    color: #ffffff;
-       background-color: st-lighten(st-lighten(#474747, 9%), 4%); }
++    background-color: st-lighten(#47474c, 9%); }
 +    .quick-toggle-menu:active:hover, .message:active:hover, .events-button:active:hover,
 +    .world-clocks-button:active:hover,
 +    .weather-button:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(#474747, 9%), 5%); }
++      background-color: st-lighten(st-lighten(#47474c, 9%), 4%); }
 +    .quick-toggle-menu:active:focus, .message:active:focus, .events-button:active:focus,
 +    .world-clocks-button:active:focus,
 +    .weather-button:active:focus {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, #474747, 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#47474c, 9%), 5%); }
 +  .quick-toggle-menu:focus, .message:focus, .events-button:focus,
 +  .world-clocks-button:focus,
 +  .weather-button:focus {
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-lighten(#474747, 4%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #47474c, 5%); }
 +    .quick-toggle-menu:focus:hover, .message:focus:hover, .events-button:focus:hover,
 +    .world-clocks-button:focus:hover,
 +    .weather-button:focus:hover {
-     background-color: st-darken(#474747, 3%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#47474c, 4%), 5%); }
 +  .quick-toggle-menu:insensitive, .message:insensitive, .events-button:insensitive,
 +  .world-clocks-button:insensitive,
 +  .weather-button:insensitive {
 +    color: st-transparentize(#ffffff, 0.5);
-     background-color: st-lighten(#353535, 7%); }
++    background-color: st-darken(#47474c, 3%); }
 +
 +.calendar, .datemenu-today-button {
 +  border: 1px solid transparent !important;
 +  background-color: transparent;
 +  border-color: transparent;
 +  box-shadow: none; }
 +  .calendar:insensitive, .datemenu-today-button:insensitive {
 +    background-color: transparent !important; }
 +  .calendar:hover, .datemenu-today-button:hover {
 +    color: #ffffff;
-     background-color: st-lighten(#353535, 9%); }
++    background-color: st-lighten(#36363a, 7%); }
 +  .calendar:active, .datemenu-today-button:active {
 +    color: #ffffff;
-       background-color: st-lighten(st-lighten(#353535, 9%), 7%); }
++    background-color: st-lighten(#36363a, 9%); }
 +    .calendar:active:hover, .datemenu-today-button:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); }
++      background-color: st-lighten(st-lighten(#36363a, 9%), 7%); }
 +    .calendar:active:focus, .datemenu-today-button:active:focus {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, #474747, 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#36363a, 9%), 5%); }
 +  .calendar:focus, .datemenu-today-button:focus {
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-lighten(#474747, 4%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #47474c, 5%); }
 +    .calendar:focus:hover, .datemenu-today-button:focus:hover {
-     background-color: st-darken(#474747, 3%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#47474c, 4%), 5%); }
 +  .calendar:insensitive, .datemenu-today-button:insensitive {
 +    color: st-transparentize(#ffffff, 0.5);
-   background-color: #474747;
++    background-color: st-darken(#47474c, 3%); }
 +
 +.unlock-dialog .login-dialog-prompt-entry, .login-dialog .login-dialog-prompt-entry, .app-folder-dialog .folder-name-container .folder-name-entry, .search-entry, .lg-dialog StEntry, StEntry {
 +  border-radius: 8px;
 +  padding: 9px 9px;
 +  selection-background-color: st-transparentize(-st-accent-color, 0.7);
 +  selected-color: #ffffff; }
 +
 +StEntry {
-     background-color: #515151;
++  background-color: #48484c;
 +  color: rgba(255, 255, 255, 0.7); }
 +  StEntry:hover {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, #474747, 5%);
++    background-color: #525256;
 +    color: #ffffff; }
 +  StEntry:focus {
-     background-color: #3f3f3f;
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #48484c, 5%);
 +    color: #ffffff; }
 +  StEntry:insensitive {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.15), 5%); }
++    background-color: #414144;
 +    color: rgba(255, 255, 255, 0.5); }
 +  StEntry StLabel.hint-text {
 +    color: rgba(255, 255, 255, 0.7); }
 +
 +.notification-button, .message .message-header .message-expand-button,
 +.message .message-header .message-close-button {
 +  font-weight: bold;
 +  padding: 6px 12px;
 +  border-radius: 8px;
 +  color: #ffffff;
 +  background-color: rgba(255, 255, 255, 0.15); }
 +  .notification-button:focus, .message .message-header .message-expand-button:focus,
 +  .message .message-header .message-close-button:focus {
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.3), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.15), 5%); }
 +    .notification-button:focus:hover, .message .message-header .message-expand-button:focus:hover,
 +    .message .message-header .message-close-button:focus:hover {
-       background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.2), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.3), 5%); }
 +  .notification-button:hover, .message .message-header .message-expand-button:hover,
 +  .message .message-header .message-close-button:hover {
 +    color: #ffffff;
 +    background-color: rgba(255, 255, 255, 0.3); }
 +  .notification-button:active, .message .message-header .message-expand-button:active,
 +  .message .message-header .message-close-button:active {
 +    color: #ffffff;
 +    background-color: rgba(255, 255, 255, 0.2); }
 +    .notification-button:active:hover, .message .message-header .message-expand-button:active:hover,
 +    .message .message-header .message-close-button:active:hover {
 +      background-color: rgba(255, 255, 255, 0.2); }
 +    .notification-button:active:focus, .message .message-header .message-expand-button:active:focus,
 +    .message .message-header .message-close-button:active:focus {
-     background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 8%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.2), 5%); }
 +  .notification-button:checked, .message .message-header .message-expand-button:checked,
 +  .message .message-header .message-close-button:checked {
 +    color: #ffffff;
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 4%); }
++    background-color: st-lighten(st-mix(#ffffff, #36363a, 9%), 8%); }
 +    .notification-button:checked:hover, .message .message-header .message-expand-button:checked:hover,
 +    .message .message-header .message-close-button:checked:hover {
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 9%); }
++      background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 8%), 4%); }
 +    .notification-button:checked:active, .message .message-header .message-expand-button:checked:active,
 +    .message .message-header .message-close-button:checked:active {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.1), 5%); }
++      background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 8%), 9%); }
 +  .notification-button:insensitive, .message .message-header .message-expand-button:insensitive,
 +  .message .message-header .message-close-button:insensitive {
 +    color: st-transparentize(#ffffff, 0.5);
 +    background-color: rgba(255, 255, 255, 0.1); }
 +
 +.modal-dialog .modal-dialog-button-box .modal-dialog-button {
 +  font-weight: bold;
 +  padding: 12px;
 +  border-radius: 12px;
 +  color: #ffffff;
 +  background-color: rgba(255, 255, 255, 0.1); }
 +  .modal-dialog .modal-dialog-button-box .modal-dialog-button:focus {
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.13), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.1), 5%); }
 +    .modal-dialog .modal-dialog-button-box .modal-dialog-button:focus:hover {
-       background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.16), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.13), 5%); }
 +  .modal-dialog .modal-dialog-button-box .modal-dialog-button:hover {
 +    color: #ffffff;
 +    background-color: rgba(255, 255, 255, 0.13); }
 +  .modal-dialog .modal-dialog-button-box .modal-dialog-button:active {
 +    color: #ffffff;
 +    background-color: rgba(255, 255, 255, 0.16); }
 +    .modal-dialog .modal-dialog-button-box .modal-dialog-button:active:hover {
 +      background-color: rgba(255, 255, 255, 0.19); }
 +    .modal-dialog .modal-dialog-button-box .modal-dialog-button:active:focus {
-     background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 8%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.16), 5%); }
 +  .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked {
 +    color: #ffffff;
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 4%); }
++    background-color: st-lighten(st-mix(#ffffff, #36363a, 9%), 8%); }
 +    .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked:hover {
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 9%); }
++      background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 8%), 4%); }
 +    .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked:active {
-     background-color: st-darken(st-mix(#ffffff, #353535, 9%), 3%); }
++      background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 8%), 9%); }
 +  .modal-dialog .modal-dialog-button-box .modal-dialog-button:insensitive {
 +    color: st-transparentize(#ffffff, 0.5);
- .conflicting-session-dialog-content .conflicting-session-dialog-title, .message-dialog-content .message-dialog-title, .message-list .message-list-placeholder, .datemenu-today-button .date-label {
++    background-color: st-darken(st-mix(#ffffff, #36363a, 9%), 3%); }
 +
 +.dash-label, .window-caption, .screenshot-ui-tooltip {
 +  background-color: rgba(0, 0, 0, 0.9);
 +  border: 1px solid rgba(255, 255, 255, 0.1);
 +  color: #ffffff;
 +  border-radius: 999px;
 +  padding: 6px 12px;
 +  text-align: center; }
 +
 +/* General Typography */
 +.unlock-dialog-clock .unlock-dialog-clock-date, .app-folder-dialog .folder-name-container .folder-name-label, .app-folder-dialog .folder-name-container .folder-name-entry, .search-statustext {
 +  font-weight: 800;
 +  font-size: 1.818em; }
 +
- .unlock-dialog .user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title {
++.conflicting-session-dialog-content .conflicting-session-dialog-title, .message-dialog-content .message-dialog-title, .datemenu-today-button .date-label {
 +  font-weight: 800;
 +  font-size: 1.364em; }
 +
 +.login-dialog .user-widget.horizontal .user-widget-label,
- .login-dialog-not-listed-label, #LookingGlassExtensions .lg-extension .lg-extension-name, #LookingGlassWindows .lg-window .lg-window-name, #LookingGlassPropertyInspector .lg-obj-inspector-title, .background-app-item .title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-box .weather-header-box .weather-header, .world-clocks-button .world-clocks-header, .events-button .events-box .events-list .event-box .event-summary, .events-button .events-box .events-title, .calendar .calendar-month-header .calendar-month-label {
++.unlock-dialog .user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title, .message-list .message-list-placeholder {
 +  font-weight: 700;
 +  font-size: 1.364em; }
 +
 +.login-dialog-auth-list-label, #LookingGlassDebugFlags .lg-debug-flags-header, #LookingGlassExtensions .lg-extensions-none, .word-suggestions, .bt-menu-placeholder.popup-menu-item, .restart-message, .polkit-dialog-user-layout .polkit-dialog-user-label,
 +.polkit-dialog-user-layout .polkit-dialog-user-root-label, .message-dialog-content .message-dialog-title.lightweight {
 +  font-weight: 700;
 +  font-size: 1.182em; }
 +
- .lg-completions-text, .caps-lock-warning-label, .background-app-item .subtitle, .quick-toggle StBoxLayout > .quick-toggle-subtitle, .screenshot-ui-type-button .icon-label-button-container, .prompt-dialog .prompt-dialog-error-label,
++.login-dialog-not-listed-label, #LookingGlassExtensions .lg-extension .lg-extension-name, #LookingGlassWindows .lg-window .lg-window-name, #LookingGlassPropertyInspector .lg-obj-inspector-title, .background-app-item .title, .quick-toggle .quick-toggle-title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-box .weather-header-box .weather-header, .world-clocks-button .world-clocks-header, .events-button .events-box .events-list .event-box .event-summary, .events-button .events-box .events-title, .calendar .calendar-month-header .calendar-month-label {
 +  font-weight: 700;
 +  font-size: 1em; }
 +
 +.quick-toggle-menu .header .subtitle, .app-menu .popup-inactive-menu-item:first-child > StLabel {
 +  font-weight: 700;
 +  font-size: 0.818em; }
 +
-   background-color: #353535;
++.lg-completions-text, .caps-lock-warning-label, .background-app-item .subtitle, .quick-toggle .quick-toggle-subtitle, .screenshot-ui-type-button .icon-label-button-container, .prompt-dialog .prompt-dialog-error-label,
 +.prompt-dialog .prompt-dialog-info-label,
 +.prompt-dialog .prompt-dialog-null-label, .run-dialog .run-dialog-description, .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description, .message .message-header .message-header-content .event-time, .world-clocks-button .world-clocks-grid .world-clocks-timezone, .events-button .events-box .events-list .event-box .event-time {
 +  font-weight: 400;
 +  font-size: 0.818em; }
 +
 +.weather-button .weather-box .weather-grid .weather-forecast-time, .calendar .calendar-week-number, .calendar .calendar-day-heading, .calendar .calendar-day {
 +  font-weight: 400;
 +  font-size: 0.818em; }
 +
 +#LookingGlassDebugFlags .lg-debug-flag-button StLabel, #LookingGlassEvaluator .evaluator-results, .lg-dialog .actor-link {
 +  font-family: monospace; }
 +
 +.unlock-dialog-clock .unlock-dialog-clock-time, #panel, .weather-button .weather-box .weather-grid .weather-forecast-temp, .world-clocks-button .world-clocks-grid .world-clocks-timezone, .world-clocks-button .world-clocks-grid .world-clocks-time, .events-button .events-box .events-list .event-box .event-time, .calendar .calendar-day-heading, .calendar .calendar-day {
 +  font-feature-settings: "tnum"; }
 +
 +/* OSD Elements */
 +#LookingGlassDialog, .screenshot-ui-panel, .workspace-switcher, .switcher-list, .resize-popup, .osd-window {
 +  color: #ffffff;
-   background-color: #474747;
++  background-color: #2e2e33;
 +  border: 1px solid rgba(255, 255, 255, 0.02);
 +  border-radius: 999px;
 +  padding: 12px; }
 +
 +.lg-dialog StEntry {
-     background-color: #515151;
++  background-color: #414146;
 +  color: rgba(255, 255, 255, 0.7); }
 +  .lg-dialog StEntry:hover {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, #474747, 5%);
++    background-color: #4b4b51;
 +    color: #ffffff; }
 +  .lg-dialog StEntry:focus {
-     background-color: #3f3f3f;
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #414146, 5%);
 +    color: #ffffff; }
 +  .lg-dialog StEntry:insensitive {
-   background-color: st-mix(#ffffff, #353535, 9%); }
++    background-color: #3a3a3e;
 +    color: rgba(255, 255, 255, 0.5); }
 +  .lg-dialog StEntry StLabel.hint-text {
 +    color: rgba(255, 255, 255, 0.7); }
 +
 +#LookingGlassDebugFlags .lg-debug-flag-button, #LookingGlassPropertyInspector .lg-obj-inspector-close-button,
 +#LookingGlassPropertyInspector .lg-obj-inspector-button, #LookingGlassDialog > #Toolbar .lg-toolbar-button {
 +  color: #ffffff;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 9%), 5%); }
++  background-color: st-mix(#ffffff, #2e2e33, 9%); }
 +  #LookingGlassDebugFlags .lg-debug-flag-button:focus, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:focus,
 +  #LookingGlassPropertyInspector .lg-obj-inspector-button:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus {
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 4%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#ffffff, #2e2e33, 9%), 5%); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button:focus:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:focus:hover,
 +    #LookingGlassPropertyInspector .lg-obj-inspector-button:focus:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus:hover {
-     background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 4%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #2e2e33, 9%), 4%), 5%); }
 +  #LookingGlassDebugFlags .lg-debug-flag-button:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:hover,
 +  #LookingGlassPropertyInspector .lg-obj-inspector-button:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:hover {
 +    color: #ffffff;
-     background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 9%); }
++    background-color: st-lighten(st-mix(#ffffff, #2e2e33, 9%), 4%); }
 +  #LookingGlassDebugFlags .lg-debug-flag-button:active, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active,
 +  #LookingGlassPropertyInspector .lg-obj-inspector-button:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active {
 +    color: #ffffff;
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 9%), 4%); }
++    background-color: st-lighten(st-mix(#ffffff, #2e2e33, 9%), 9%); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button:active:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active:hover,
 +    #LookingGlassPropertyInspector .lg-obj-inspector-button:active:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 9%), 5%); }
++      background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 9%), 9%), 4%); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button:active:focus, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active:focus,
 +    #LookingGlassPropertyInspector .lg-obj-inspector-button:active:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active:focus {
-     background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 8%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #2e2e33, 9%), 9%), 5%); }
 +  #LookingGlassDebugFlags .lg-debug-flag-button:checked, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked,
 +  #LookingGlassPropertyInspector .lg-obj-inspector-button:checked, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked {
 +    color: #ffffff;
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 4%); }
++    background-color: st-lighten(st-mix(#ffffff, #2e2e33, 9%), 8%); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button:checked:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked:hover,
 +    #LookingGlassPropertyInspector .lg-obj-inspector-button:checked:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:hover {
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 9%); }
++      background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 9%), 8%), 4%); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button:checked:active, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked:active,
 +    #LookingGlassPropertyInspector .lg-obj-inspector-button:checked:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:active {
-     background-color: st-darken(st-mix(#ffffff, #353535, 9%), 3%); }
++      background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 9%), 8%), 9%); }
 +  #LookingGlassDebugFlags .lg-debug-flag-button:insensitive, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:insensitive,
 +  #LookingGlassPropertyInspector .lg-obj-inspector-button:insensitive, #LookingGlassDialog > #Toolbar .lg-toolbar-button:insensitive {
 +    color: st-transparentize(#ffffff, 0.5);
-   background-color: #353535; }
++    background-color: st-darken(st-mix(#ffffff, #2e2e33, 9%), 3%); }
 +
 +#LookingGlassDialog .notebook-tab, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button {
 +  color: #ffffff;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); }
++  background-color: #2e2e33; }
 +  #LookingGlassDialog .notebook-tab:focus, .screenshot-ui-show-pointer-button:focus, .screenshot-ui-type-button:focus {
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(46, 46, 51, 0.25), 5%); }
 +    #LookingGlassDialog .notebook-tab:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .screenshot-ui-type-button:focus:hover {
-     background-color: st-lighten(#353535, 7%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#2e2e33, 7%), 5%); }
 +  #LookingGlassDialog .notebook-tab:hover, .screenshot-ui-show-pointer-button:hover, .screenshot-ui-type-button:hover {
 +    color: #ffffff;
-     background-color: st-lighten(#353535, 9%); }
++    background-color: st-lighten(#2e2e33, 7%); }
 +  #LookingGlassDialog .notebook-tab:active, .screenshot-ui-show-pointer-button:active, .screenshot-ui-type-button:active {
 +    color: #ffffff;
-       background-color: st-lighten(st-lighten(#353535, 9%), 7%); }
++    background-color: st-lighten(#2e2e33, 9%); }
 +    #LookingGlassDialog .notebook-tab:active:hover, .screenshot-ui-show-pointer-button:active:hover, .screenshot-ui-type-button:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); }
++      background-color: st-lighten(st-lighten(#2e2e33, 9%), 7%); }
 +    #LookingGlassDialog .notebook-tab:active:focus, .screenshot-ui-show-pointer-button:active:focus, .screenshot-ui-type-button:active:focus {
-     background-color: st-lighten(#353535, 8%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#2e2e33, 9%), 5%); }
 +  #LookingGlassDialog .notebook-tab:checked, .screenshot-ui-show-pointer-button:checked, .screenshot-ui-type-button:checked {
 +    color: #ffffff;
-       background-color: st-lighten(st-lighten(#353535, 8%), 7%); }
++    background-color: st-lighten(#2e2e33, 8%); }
 +    #LookingGlassDialog .notebook-tab:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .screenshot-ui-type-button:checked:hover {
-       background-color: st-lighten(st-lighten(#353535, 8%), 9%); }
++      background-color: st-lighten(st-lighten(#2e2e33, 8%), 7%); }
 +    #LookingGlassDialog .notebook-tab:checked:active, .screenshot-ui-show-pointer-button:checked:active, .screenshot-ui-type-button:checked:active {
-     background-color: #353535; }
++      background-color: st-lighten(st-lighten(#2e2e33, 8%), 9%); }
 +  #LookingGlassDialog .notebook-tab:insensitive, .screenshot-ui-show-pointer-button:insensitive, .screenshot-ui-type-button:insensitive {
 +    color: st-transparentize(#ffffff, 0.5);
-   background-color: #464646;
-   color: rgba(245, 245, 245, 0.7); }
++    background-color: #2e2e33; }
 +
 +/* System Elements */
 +.login-dialog .login-dialog-prompt-entry, .app-folder-dialog .folder-name-container .folder-name-entry, .search-entry {
-     background-color: #505050;
-     color: whitesmoke; }
++  background-color: #404045;
++  color: rgba(250, 250, 251, 0.7); }
 +  .login-dialog .login-dialog-prompt-entry:hover, .app-folder-dialog .folder-name-container .folder-name-entry:hover, .search-entry:hover {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, #464646, 5%);
-     color: whitesmoke; }
++    background-color: #4a4a50;
++    color: #fafafb; }
 +  .login-dialog .login-dialog-prompt-entry:focus, .app-folder-dialog .folder-name-container .folder-name-entry:focus, .search-entry:focus {
-     background-color: #3e3e3e;
-     color: rgba(245, 245, 245, 0.5); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #404045, 5%);
++    color: #fafafb; }
 +  .login-dialog .login-dialog-prompt-entry:insensitive, .app-folder-dialog .folder-name-container .folder-name-entry:insensitive, .search-entry:insensitive {
-     color: rgba(245, 245, 245, 0.7); }
++    background-color: #39393d;
++    color: rgba(250, 250, 251, 0.5); }
 +  .login-dialog .login-dialog-prompt-entry StLabel.hint-text, .app-folder-dialog .folder-name-container .folder-name-entry StLabel.hint-text, .search-entry StLabel.hint-text {
-   color: whitesmoke;
-   background-color: st-mix(whitesmoke, #353535, 9%); }
++    color: rgba(250, 250, 251, 0.7); }
 +
 +.login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button {
-     color: st-transparentize(whitesmoke, 0.5);
-     background-color: st-darken(st-mix(whitesmoke, #353535, 9%), 3%); }
++  color: #fafafb;
++  background-color: st-mix(#fafafb, #2e2e33, 9%); }
 +  .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive {
-     color: whitesmoke;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, st-mix(whitesmoke, #353535, 9%), 5%); }
++    color: st-transparentize(#fafafb, 0.5);
++    background-color: st-darken(st-mix(#fafafb, #2e2e33, 9%), 3%); }
 +  .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus {
-       background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #353535, 9%), 4%), 5%); }
++    color: #fafafb;
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#fafafb, #2e2e33, 9%), 5%); }
 +    .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover {
-     color: whitesmoke;
-     background-color: st-lighten(st-mix(whitesmoke, #353535, 9%), 4%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #2e2e33, 9%), 4%), 5%); }
 +  .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover {
-     color: whitesmoke;
-     background-color: st-lighten(st-mix(whitesmoke, #353535, 9%), 9%); }
++    color: #fafafb;
++    background-color: st-lighten(st-mix(#fafafb, #2e2e33, 9%), 4%); }
 +  .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active {
-       background-color: st-lighten(st-lighten(st-mix(whitesmoke, #353535, 9%), 9%), 4%); }
++    color: #fafafb;
++    background-color: st-lighten(st-mix(#fafafb, #2e2e33, 9%), 9%); }
 +    .login-dialog-button.cancel-button:active:hover, .login-dialog-button.switch-user-button:active:hover, .login-dialog-button.login-dialog-session-list-button:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #353535, 9%), 9%), 5%); }
++      background-color: st-lighten(st-lighten(st-mix(#fafafb, #2e2e33, 9%), 9%), 4%); }
 +    .login-dialog-button.cancel-button:active:focus, .login-dialog-button.switch-user-button:active:focus, .login-dialog-button.login-dialog-session-list-button:active:focus {
-     color: whitesmoke;
-     background-color: st-lighten(st-mix(whitesmoke, #353535, 9%), 8%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #2e2e33, 9%), 9%), 5%); }
 +  .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked {
-       background-color: st-lighten(st-lighten(st-mix(whitesmoke, #353535, 9%), 8%), 4%); }
++    color: #fafafb;
++    background-color: st-lighten(st-mix(#fafafb, #2e2e33, 9%), 8%); }
 +    .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover {
-       background-color: st-lighten(st-lighten(st-mix(whitesmoke, #353535, 9%), 8%), 9%); }
++      background-color: st-lighten(st-lighten(st-mix(#fafafb, #2e2e33, 9%), 8%), 4%); }
 +    .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active {
-   color: whitesmoke;
-   background-color: rgba(245, 245, 245, 0.1); }
++      background-color: st-lighten(st-lighten(st-mix(#fafafb, #2e2e33, 9%), 8%), 9%); }
 +
 +/* Lockscreen Elements */
 +.unlock-dialog .button,
 +.unlock-dialog .icon-button,
 +.unlock-dialog .calendar .calendar-month-header .pager-button,
 +.calendar .calendar-month-header .unlock-dialog .pager-button,
 +.unlock-dialog .message .message-header .message-expand-button,
 +.message .message-header .unlock-dialog .message-expand-button,
 +.unlock-dialog .message .message-header .message-close-button,
 +.message .message-header .unlock-dialog .message-close-button,
 +.unlock-dialog .screenshot-ui-show-pointer-button,
 +.unlock-dialog .login-dialog-button.cancel-button,
 +.unlock-dialog .login-dialog-button.switch-user-button,
 +.unlock-dialog .login-dialog-button.login-dialog-session-list-button {
-     color: whitesmoke;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.1), 5%); }
++  color: #fafafb;
++  background-color: rgba(250, 250, 251, 0.1); }
 +  .unlock-dialog .button:focus,
 +  .unlock-dialog .icon-button:focus,
 +  .unlock-dialog .calendar .calendar-month-header .pager-button:focus,
 +  .calendar .calendar-month-header .unlock-dialog .pager-button:focus,
 +  .unlock-dialog .message .message-header .message-expand-button:focus,
 +  .message .message-header .unlock-dialog .message-expand-button:focus,
 +  .unlock-dialog .message .message-header .message-close-button:focus,
 +  .message .message-header .unlock-dialog .message-close-button:focus,
 +  .unlock-dialog .screenshot-ui-show-pointer-button:focus,
 +  .unlock-dialog .login-dialog-button.cancel-button:focus,
 +  .unlock-dialog .login-dialog-button.switch-user-button:focus,
 +  .unlock-dialog .login-dialog-button.login-dialog-session-list-button:focus {
-       background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.13), 5%); }
++    color: #fafafb;
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(250, 250, 251, 0.1), 5%); }
 +    .unlock-dialog .button:focus:hover,
 +    .unlock-dialog .icon-button:focus:hover,
 +    .unlock-dialog .calendar .calendar-month-header .pager-button:focus:hover,
 +    .calendar .calendar-month-header .unlock-dialog .pager-button:focus:hover,
 +    .unlock-dialog .message .message-header .message-expand-button:focus:hover,
 +    .message .message-header .unlock-dialog .message-expand-button:focus:hover,
 +    .unlock-dialog .message .message-header .message-close-button:focus:hover,
 +    .message .message-header .unlock-dialog .message-close-button:focus:hover,
 +    .unlock-dialog .screenshot-ui-show-pointer-button:focus:hover,
 +    .unlock-dialog .login-dialog-button.cancel-button:focus:hover,
 +    .unlock-dialog .login-dialog-button.switch-user-button:focus:hover,
 +    .unlock-dialog .login-dialog-button.login-dialog-session-list-button:focus:hover {
-     color: whitesmoke;
-     background-color: rgba(245, 245, 245, 0.13); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(250, 250, 251, 0.13), 5%); }
 +  .unlock-dialog .button:hover,
 +  .unlock-dialog .icon-button:hover,
 +  .unlock-dialog .calendar .calendar-month-header .pager-button:hover,
 +  .calendar .calendar-month-header .unlock-dialog .pager-button:hover,
 +  .unlock-dialog .message .message-header .message-expand-button:hover,
 +  .message .message-header .unlock-dialog .message-expand-button:hover,
 +  .unlock-dialog .message .message-header .message-close-button:hover,
 +  .message .message-header .unlock-dialog .message-close-button:hover,
 +  .unlock-dialog .screenshot-ui-show-pointer-button:hover,
 +  .unlock-dialog .login-dialog-button.cancel-button:hover,
 +  .unlock-dialog .login-dialog-button.switch-user-button:hover,
 +  .unlock-dialog .login-dialog-button.login-dialog-session-list-button:hover {
-     color: whitesmoke;
-     background-color: rgba(245, 245, 245, 0.16); }
++    color: #fafafb;
++    background-color: rgba(250, 250, 251, 0.13); }
 +  .unlock-dialog .button:active,
 +  .unlock-dialog .icon-button:active,
 +  .unlock-dialog .calendar .calendar-month-header .pager-button:active,
 +  .calendar .calendar-month-header .unlock-dialog .pager-button:active,
 +  .unlock-dialog .message .message-header .message-expand-button:active,
 +  .message .message-header .unlock-dialog .message-expand-button:active,
 +  .unlock-dialog .message .message-header .message-close-button:active,
 +  .message .message-header .unlock-dialog .message-close-button:active,
 +  .unlock-dialog .screenshot-ui-show-pointer-button:active,
 +  .unlock-dialog .login-dialog-button.cancel-button:active,
 +  .unlock-dialog .login-dialog-button.switch-user-button:active,
 +  .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active {
-       background-color: rgba(245, 245, 245, 0.19); }
++    color: #fafafb;
++    background-color: rgba(250, 250, 251, 0.16); }
 +    .unlock-dialog .button:active:hover,
 +    .unlock-dialog .icon-button:active:hover,
 +    .unlock-dialog .calendar .calendar-month-header .pager-button:active:hover,
 +    .calendar .calendar-month-header .unlock-dialog .pager-button:active:hover,
 +    .unlock-dialog .message .message-header .message-expand-button:active:hover,
 +    .message .message-header .unlock-dialog .message-expand-button:active:hover,
 +    .unlock-dialog .message .message-header .message-close-button:active:hover,
 +    .message .message-header .unlock-dialog .message-close-button:active:hover,
 +    .unlock-dialog .screenshot-ui-show-pointer-button:active:hover,
 +    .unlock-dialog .login-dialog-button.cancel-button:active:hover,
 +    .unlock-dialog .login-dialog-button.switch-user-button:active:hover,
 +    .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active:hover {
-       background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.16), 5%); }
++      background-color: rgba(250, 250, 251, 0.19); }
 +    .unlock-dialog .button:active:focus,
 +    .unlock-dialog .icon-button:active:focus,
 +    .unlock-dialog .calendar .calendar-month-header .pager-button:active:focus,
 +    .calendar .calendar-month-header .unlock-dialog .pager-button:active:focus,
 +    .unlock-dialog .message .message-header .message-expand-button:active:focus,
 +    .message .message-header .unlock-dialog .message-expand-button:active:focus,
 +    .unlock-dialog .message .message-header .message-close-button:active:focus,
 +    .message .message-header .unlock-dialog .message-close-button:active:focus,
 +    .unlock-dialog .screenshot-ui-show-pointer-button:active:focus,
 +    .unlock-dialog .login-dialog-button.cancel-button:active:focus,
 +    .unlock-dialog .login-dialog-button.switch-user-button:active:focus,
 +    .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active:focus {
-     color: whitesmoke;
-     background-color: st-lighten(st-mix(whitesmoke, #353535, 9%), 8%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(250, 250, 251, 0.16), 5%); }
 +  .unlock-dialog .button:checked,
 +  .unlock-dialog .icon-button:checked,
 +  .unlock-dialog .calendar .calendar-month-header .pager-button:checked,
 +  .calendar .calendar-month-header .unlock-dialog .pager-button:checked,
 +  .unlock-dialog .message .message-header .message-expand-button:checked,
 +  .message .message-header .unlock-dialog .message-expand-button:checked,
 +  .unlock-dialog .message .message-header .message-close-button:checked,
 +  .message .message-header .unlock-dialog .message-close-button:checked,
 +  .unlock-dialog .screenshot-ui-show-pointer-button:checked,
 +  .unlock-dialog .login-dialog-button.cancel-button:checked,
 +  .unlock-dialog .login-dialog-button.switch-user-button:checked,
 +  .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked {
-       background-color: st-lighten(st-lighten(st-mix(whitesmoke, #353535, 9%), 8%), 4%); }
++    color: #fafafb;
++    background-color: st-lighten(st-mix(#fafafb, #36363a, 9%), 8%); }
 +    .unlock-dialog .button:checked:hover,
 +    .unlock-dialog .icon-button:checked:hover,
 +    .unlock-dialog .calendar .calendar-month-header .pager-button:checked:hover,
 +    .calendar .calendar-month-header .unlock-dialog .pager-button:checked:hover,
 +    .unlock-dialog .message .message-header .message-expand-button:checked:hover,
 +    .message .message-header .unlock-dialog .message-expand-button:checked:hover,
 +    .unlock-dialog .message .message-header .message-close-button:checked:hover,
 +    .message .message-header .unlock-dialog .message-close-button:checked:hover,
 +    .unlock-dialog .screenshot-ui-show-pointer-button:checked:hover,
 +    .unlock-dialog .login-dialog-button.cancel-button:checked:hover,
 +    .unlock-dialog .login-dialog-button.switch-user-button:checked:hover,
 +    .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked:hover {
-       background-color: st-lighten(st-lighten(st-mix(whitesmoke, #353535, 9%), 8%), 9%); }
++      background-color: st-lighten(st-lighten(st-mix(#fafafb, #36363a, 9%), 8%), 4%); }
 +    .unlock-dialog .button:checked:active,
 +    .unlock-dialog .icon-button:checked:active,
 +    .unlock-dialog .calendar .calendar-month-header .pager-button:checked:active,
 +    .calendar .calendar-month-header .unlock-dialog .pager-button:checked:active,
 +    .unlock-dialog .message .message-header .message-expand-button:checked:active,
 +    .message .message-header .unlock-dialog .message-expand-button:checked:active,
 +    .unlock-dialog .message .message-header .message-close-button:checked:active,
 +    .message .message-header .unlock-dialog .message-close-button:checked:active,
 +    .unlock-dialog .screenshot-ui-show-pointer-button:checked:active,
 +    .unlock-dialog .login-dialog-button.cancel-button:checked:active,
 +    .unlock-dialog .login-dialog-button.switch-user-button:checked:active,
 +    .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked:active {
-     color: st-transparentize(whitesmoke, 0.5);
-     background-color: st-darken(st-mix(whitesmoke, #353535, 9%), 3%); }
++      background-color: st-lighten(st-lighten(st-mix(#fafafb, #36363a, 9%), 8%), 9%); }
 +  .unlock-dialog .button:insensitive,
 +  .unlock-dialog .icon-button:insensitive,
 +  .unlock-dialog .calendar .calendar-month-header .pager-button:insensitive,
 +  .calendar .calendar-month-header .unlock-dialog .pager-button:insensitive,
 +  .unlock-dialog .message .message-header .message-expand-button:insensitive,
 +  .message .message-header .unlock-dialog .message-expand-button:insensitive,
 +  .unlock-dialog .message .message-header .message-close-button:insensitive,
 +  .message .message-header .unlock-dialog .message-close-button:insensitive,
 +  .unlock-dialog .screenshot-ui-show-pointer-button:insensitive,
 +  .unlock-dialog .login-dialog-button.cancel-button:insensitive,
 +  .unlock-dialog .login-dialog-button.switch-user-button:insensitive,
 +  .unlock-dialog .login-dialog-button.login-dialog-session-list-button:insensitive {
-   background-color: rgba(245, 245, 245, 0.1);
-   color: rgba(245, 245, 245, 0.7); }
++    color: st-transparentize(#fafafb, 0.5);
++    background-color: st-darken(st-mix(#fafafb, #36363a, 9%), 3%); }
 +
 +.unlock-dialog .login-dialog-prompt-entry {
-     color: whitesmoke; }
++  background-color: rgba(250, 250, 251, 0.1);
++  color: rgba(250, 250, 251, 0.7); }
 +  .unlock-dialog .login-dialog-prompt-entry:hover {
 +    background-color: rgba(255, 255, 255, 0.1);
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.1), 5%);
-     color: whitesmoke;
-     box-shadow: inset 0 0 0 2px rgba(245, 245, 245, 0.4) !important;
-     background-color: st-mix(rgba(245, 245, 245, 0.4), rgba(245, 245, 245, 0.1), 5%); }
++    color: #fafafb; }
 +  .unlock-dialog .login-dialog-prompt-entry:focus {
-     background-color: rgba(237, 237, 237, 0.1);
-     color: rgba(245, 245, 245, 0.5); }
++    box-shadow: inset 0 0 0 2px st-transparentize(rgba(250, 250, 251, 0.4), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(250, 250, 251, 0.1), 5%);
++    color: #fafafb;
++    box-shadow: inset 0 0 0 2px st-transparentize(rgba(250, 250, 251, 0.4), 0.2) !important;
++    background-color: st-mix(rgba(250, 250, 251, 0.4), rgba(250, 250, 251, 0.1), 5%); }
 +  .unlock-dialog .login-dialog-prompt-entry:insensitive {
-     color: rgba(245, 245, 245, 0.7); }
++    background-color: rgba(242, 242, 244, 0.1);
++    color: rgba(250, 250, 251, 0.5); }
 +  .unlock-dialog .login-dialog-prompt-entry StLabel.hint-text {
-   warning-color: #f6d32d;
++    color: rgba(250, 250, 251, 0.7); }
 +
 +/* WIDGETS */
 +.shell-link {
 +  color: st-lighten(-st-accent-color, 20%); }
 +  .shell-link:hover {
 +    color: st-lighten(st-lighten(-st-accent-color, 20%), 10%); }
 +
 +.lowres-icon {
 +  icon-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); }
 +
 +.icon-dropshadow {
 +  icon-shadow: 0 2px 4px rgba(0, 0, 0, 0.4); }
 +
 +/* Entries */
 +StEntry StIcon.capslock-warning {
 +  icon-size: 1.091em;
-     background: #d7d7d7;
++  warning-color: #cd9309;
 +  padding: 0 4px; }
 +
 +StEntry StIcon.peek-password {
 +  icon-size: 1.091em;
 +  padding: 0 4px; }
 +
 +StEntry StLabel.hint-text {
 +  margin-left: 2px; }
 +
 +/* Buttons */
 +.button {
 +  min-height: 1.5em; }
 +
 +.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .screenshot-ui-show-pointer-button, .message .message-header .message-expand-button,
 +.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button {
 +  border-radius: 999px;
 +  padding: 0.818em;
 +  min-height: 1.091em; }
 +  .icon-button StIcon, .login-dialog-button.cancel-button StIcon, .login-dialog-button.switch-user-button StIcon, .login-dialog-button.login-dialog-session-list-button StIcon, .screenshot-ui-show-pointer-button StIcon, .message .message-header .message-expand-button StIcon,
 +  .message .message-header .message-close-button StIcon, .calendar .calendar-month-header .pager-button StIcon {
 +    icon-size: 1.091em;
 +    -st-icon-style: symbolic; }
 +
 +/* Check Boxes */
 +.check-box StBoxLayout {
 +  spacing: .8em; }
 +
 +.check-box StBin {
 +  border-radius: 7px;
 +  padding: 2px; }
 +
 +.check-box:focus StBin {
 +  background-color: rgba(0, 0, 0, 0.01);
 +  box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.65); }
 +
 +.check-box StIcon {
 +  icon-size: 14px;
 +  padding: 1px;
 +  color: transparent;
 +  border-radius: 6px;
 +  border: 2px solid rgba(255, 255, 255, 0.15); }
 +
 +.check-box:hover StIcon {
 +  border-color: rgba(255, 255, 255, 0.2); }
 +
 +.check-box:active StIcon {
 +  border-color: rgba(255, 255, 255, 0.3); }
 +
 +.check-box:checked StIcon {
 +  background-color: -st-accent-color;
 +  color: -st-accent-fg-color;
 +  border-color: transparent; }
 +
 +.check-box:checked:hover StIcon {
 +  background-color: st-lighten(-st-accent-color, 5%);
 +  color: st-lighten(-st-accent-fg-color, 5%); }
 +
 +.check-box:checked:active StIcon {
 +  background-color: st-darken(-st-accent-color, 7%);
 +  color: st-darken(-st-accent-fg-color, 7%); }
 +
 +/* Switches */
 +.toggle-switch {
 +  width: 46px;
 +  border-radius: 999px;
 +  transition-duration: 100ms;
 +  color: #ffffff;
 +  background: rgba(255, 255, 255, 0.15); }
 +  .toggle-switch:hover {
 +    background: rgba(255, 255, 255, 0.2); }
 +  .toggle-switch StIcon {
 +    icon-size: 16px; }
 +  .toggle-switch .handle {
 +    margin: 3px;
 +    width: 20px;
 +    height: 20px;
 +    border-radius: 999px;
-     background-color: #717171;
++    background: #d7d7d8;
 +    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
 +    transition-duration: 100ms; }
 +  .toggle-switch:checked {
 +    background: -st-accent-color;
 +    color: -st-accent-fg-color; }
 +    .toggle-switch:checked:hover {
 +      background-color: st-lighten(-st-accent-color, 5%);
 +      color: st-lighten(-st-accent-fg-color, 5%); }
 +    .toggle-switch:checked .handle {
 +      background: white; }
 +
 +/* Slider */
 +.slider {
 +  color: #e8e8e8;
 +  -barlevel-height: 4px;
 +  -barlevel-background-color: rgba(255, 255, 255, 0.1);
 +  -barlevel-active-background-color: -st-accent-color;
 +  -barlevel-overdrive-color: #c01c28;
 +  -barlevel-overdrive-separator-width: 1px;
 +  -slider-handle-radius: 0.5455em; }
 +  .slider:hover {
 +    color: #ffffff; }
 +
 +/* Scrollbars */
 +StScrollView.vfade {
 +  -st-vfade-offset: 68px; }
 +
 +StScrollView.hfade {
 +  -st-hfade-offset: 68px; }
 +
 +StScrollBar {
 +  padding: 0; }
 +  StScrollView StScrollBar {
 +    min-width: 8px;
 +    min-height: 8px; }
 +  StScrollBar StBin#trough {
 +    border-radius: 0;
 +    background-color: transparent; }
 +  StScrollBar StButton#vhandle, StScrollBar StButton#hhandle {
 +    border-radius: 8px;
-       background-color: #9a9a9a; }
++    background-color: #727275;
 +    border: 3px solid transparent;
 +    transition: 500ms all ease; }
 +    StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover {
-       background-color: #868686; }
++      background-color: #9b9b9d; }
 +    StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active {
-   background-color: #353535;
++      background-color: #868689; }
 +
 +/* Popovers/Menus */
 +.popup-menu-boxpointer, .candidate-popup-boxpointer {
 +  -arrow-rise: 6px; }
 +
 +.popup-menu {
 +  min-width: 15em;
 +  color: #ffffff; }
 +  .popup-menu.panel-menu {
 +    margin-bottom: 1.75em; }
 +
 +.popup-menu-content, .candidate-popup-content {
 +  padding: 6px;
-   border: 1px solid #424242;
++  background-color: #36363a;
 +  border-radius: 20px;
-   .popup-menu-item:hover {
-     color: #ffffff;
-     background-color: st-lighten(st-mix(#ffffff, #424242, 9%), 4%); }
++  border: 1px solid #424247;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2); }
 +
 +.popup-menu-item {
 +  background-color: transparent;
 +  border-color: transparent;
 +  box-shadow: none;
 +  border-radius: 12px; }
 +  .popup-menu-item:insensitive {
 +    background-color: transparent !important; }
-     background-color: st-lighten(st-mix(#ffffff, #424242, 9%), 9%); }
 +  .popup-menu-item:active {
 +    color: #ffffff;
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #424242, 9%), 9%), 4%); }
++    background-color: st-lighten(#424247, 9%); }
 +    .popup-menu-item:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #424242, 9%), 9%), 5%); }
-   .popup-menu-item:selected, .popup-menu-item:checked {
++      background-color: st-lighten(st-lighten(#424247, 9%), 7%); }
 +    .popup-menu-item:active:focus {
-     background-color: st-lighten(st-mix(#ffffff, #424242, 9%), 8%); }
-     .popup-menu-item:selected:hover, .popup-menu-item:checked:hover {
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #424242, 9%), 8%), 4%); }
-     .popup-menu-item:selected:active, .popup-menu-item:checked:active {
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #424242, 9%), 8%), 9%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#424247, 9%), 5%); }
++  .popup-menu-item:hover, .popup-menu-item:selected, .popup-menu-item:checked {
 +    color: #ffffff;
-     background-color: st-darken(st-mix(#ffffff, #424242, 9%), 3%); }
++    background-color: st-lighten(#424247, 7%); }
 +  .popup-menu-item:insensitive {
 +    color: st-transparentize(#ffffff, 0.5);
-     color: #9a9a9a; }
++    background-color: #424247; }
 +  .popup-menu-item:checked {
 +    border-radius: 12px 12px 0 0 !important; }
 +  .popup-menu-item .toggle-switch:ltr {
 +    margin-left: 4px; }
 +  .popup-menu-item .toggle-switch:rtl {
 +    margin-right: 4px; }
 +
 +.popup-ornamented-menu-item:ltr {
 +  padding-left: 6px; }
 +
 +.popup-ornamented-menu-item:rtl {
 +  padding-right: 6px; }
 +
 +.popup-inactive-menu-item {
 +  color: #ffffff; }
 +  .popup-inactive-menu-item:insensitive {
-   background-color: #565656; }
++    color: #9b9b9d; }
 +
 +.popup-menu-arrow,
 +.popup-menu-icon {
 +  icon-size: 1.091em; }
 +
 +.popup-sub-menu {
 +  border-radius: 0 0 13px 13px;
 +  margin-bottom: 6px;
 +  border: 1px solid transparent;
-     .popup-sub-menu .popup-menu-item:hover {
-       color: #ffffff;
-       background-color: st-lighten(st-mix(#ffffff, #565656, 9%), 4%); }
++  background-color: #56565c; }
 +  .popup-sub-menu .popup-menu-item {
 +    border-radius: 0;
 +    border-top-width: 0;
 +    background-color: transparent;
 +    border-color: transparent;
 +    box-shadow: none; }
 +    .popup-sub-menu .popup-menu-item:insensitive {
 +      background-color: transparent !important; }
-       background-color: st-lighten(st-mix(#ffffff, #565656, 9%), 9%); }
 +    .popup-sub-menu .popup-menu-item:active {
 +      color: #ffffff;
-         background-color: st-lighten(st-lighten(st-mix(#ffffff, #565656, 9%), 9%), 4%); }
++      background-color: st-lighten(#56565c, 9%); }
 +      .popup-sub-menu .popup-menu-item:active:hover {
-         background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #565656, 9%), 9%), 5%); }
-     .popup-sub-menu .popup-menu-item:selected, .popup-sub-menu .popup-menu-item:checked {
++        background-color: st-lighten(st-lighten(#56565c, 9%), 7%); }
 +      .popup-sub-menu .popup-menu-item:active:focus {
-       background-color: st-lighten(st-mix(#ffffff, #565656, 9%), 8%); }
-       .popup-sub-menu .popup-menu-item:selected:hover, .popup-sub-menu .popup-menu-item:checked:hover {
-         background-color: st-lighten(st-lighten(st-mix(#ffffff, #565656, 9%), 8%), 4%); }
-       .popup-sub-menu .popup-menu-item:selected:active, .popup-sub-menu .popup-menu-item:checked:active {
-         background-color: st-lighten(st-lighten(st-mix(#ffffff, #565656, 9%), 8%), 9%); }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#56565c, 9%), 5%); }
++    .popup-sub-menu .popup-menu-item:hover, .popup-sub-menu .popup-menu-item:selected, .popup-sub-menu .popup-menu-item:checked {
 +      color: #ffffff;
-       background-color: st-darken(st-mix(#ffffff, #565656, 9%), 3%); }
++      background-color: st-lighten(#56565c, 7%); }
 +    .popup-sub-menu .popup-menu-item:insensitive {
 +      color: st-transparentize(#ffffff, 0.5);
-       color: #9a9a9a; }
++      background-color: #56565c; }
 +    .popup-sub-menu .popup-menu-item:last-child {
 +      border-radius: 0 0 12px 12px;
 +      border-bottom-width: 0; }
 +  .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:hover, .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:focus {
 +    border-radius: 0; }
 +  .popup-sub-menu .popup-menu-section:last-child .popup-menu-item:last-child {
 +    border-radius: 0 0 12px 12px; }
 +
 +.popup-menu-ornament {
 +  icon-size: 1.091em !important;
 +  width: 1.091em; }
 +
 +.popup-separator-menu-item {
 +  border: none !important; }
 +  .popup-separator-menu-item .popup-separator-menu-item-separator {
 +    height: 1px;
 +    background-color: rgba(255, 255, 255, 0.1); }
 +  .popup-sub-menu .popup-separator-menu-item {
 +    background-color: transparent; }
 +    .popup-sub-menu .popup-separator-menu-item:ltr {
 +      margin-right: 2.5em; }
 +    .popup-sub-menu .popup-separator-menu-item:rtl {
 +      margin-left: 2.5em; }
 +    .popup-sub-menu .popup-separator-menu-item .popup-separator-menu-item-separator {
 +      background-color: rgba(255, 255, 255, 0.1); }
 +
 +.background-menu {
 +  -boxpointer-gap: 0px;
 +  -arrow-rise: 0px; }
 +
 +.app-menu {
 +  max-width: 27.25em; }
 +  .app-menu .popup-inactive-menu-item:first-child > StLabel:ltr {
 +    margin-right: 8px; }
 +  .app-menu .popup-inactive-menu-item:first-child > StLabel:rtl {
 +    margin-left: 8px; }
 +
 +/* Date/Time Menu */
 +#calendarArea {
 +  padding: 4px; }
 +
 +.datemenu-popover {
 +  border-radius: 30px; }
 +
 +.datemenu-calendar-column {
 +  spacing: 6px; }
 +  .datemenu-calendar-column:ltr {
 +    margin-left: 6px; }
 +  .datemenu-calendar-column:rtl {
 +    margin-right: 6px; }
 +  .datemenu-calendar-column .datemenu-displays-box {
 +    spacing: 6px; }
 +
 +.datemenu-today-button {
 +  padding: 9px; }
 +  .datemenu-today-button .day-label {
 +    font-weight: bold; }
 +
 +.calendar {
 +  margin-top: 0;
 +  padding: 0; }
 +  .calendar .calendar-month-header .calendar-change-month-back StIcon,
 +  .calendar .calendar-month-header .calendar-change-month-forward StIcon {
 +    icon-size: 1.091em; }
 +  .calendar .calendar-month-header .calendar-month-label {
 +    color: #ffffff !important;
 +    padding: 8px 0;
 +    width: 10em;
 +    border-radius: 999px;
 +    text-align: center; }
 +  .calendar .calendar-month-header .pager-button {
 +    height: 2.6em;
 +    width: 2.6em;
 +    padding: 0; }
 +  .calendar .calendar-day {
 +    border-radius: 999px;
 +    height: 3em;
 +    width: 3em;
 +    margin: 2px;
 +    padding: 0;
 +    font-weight: bold;
 +    text-align: center; }
 +    .calendar .calendar-day.calendar-weekend {
-     background-color: rgba(154, 154, 154, 0.2);
-     color: #9a9a9a; }
++      color: #9b9b9d; }
 +    .calendar .calendar-day.calendar-other-month {
 +      color: rgba(255, 255, 255, 0.5);
 +      font-weight: normal; }
 +      .calendar .calendar-day.calendar-other-month.calendar-weekend {
 +        color: rgba(255, 255, 255, 0.5); }
 +    .calendar .calendar-day.calendar-today {
 +      color: -st-accent-fg-color !important; }
 +      .calendar .calendar-day.calendar-today.calendar-day-with-events {
 +        background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg") !important; }
 +    .calendar .calendar-day.calendar-day-with-events {
 +      background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg");
 +      background-size: contain; }
 +  .calendar .calendar-day-heading {
 +    font-weight: bold;
 +    text-align: center;
 +    margin: 4px;
 +    padding: 3px 6px;
 +    border-radius: 8px; }
 +  .calendar .calendar-week-number {
 +    font-weight: bold;
 +    font-feature-settings: "tnum";
 +    text-align: center;
 +    margin: 6px;
 +    padding: 0 6px;
 +    border-radius: 4px;
-   color: #9a9a9a;
++    background-color: rgba(155, 155, 157, 0.2);
++    color: #9b9b9d; }
 +
 +.events-button .events-box .events-title {
-       color: #9a9a9a; }
++  color: #9b9b9d;
 +  padding-bottom: 6px; }
 +
 +.events-button .events-box .events-list {
 +  spacing: 6px; }
 +  .events-button .events-box .events-list .event-box {
 +    spacing: 6px;
 +    border-radius: 8px; }
 +    .events-button .events-box .events-list .event-box .event-time {
-     color: #9a9a9a;
++      color: #9b9b9d; }
 +  .events-button .events-box .events-list .event-placeholder {
-   color: #9a9a9a; }
++    color: #9b9b9d;
 +    font-style: italic; }
 +
 +.world-clocks-button .world-clocks-header {
-     color: #9a9a9a; }
++  color: #9b9b9d; }
 +  .world-clocks-button .world-clocks-header.no-world-clocks {
 +    color: #ffffff; }
 +
 +.world-clocks-button .world-clocks-grid {
 +  spacing-rows: 6px;
 +  spacing-columns: 12px; }
 +  .world-clocks-button .world-clocks-grid .world-clocks-time {
 +    font-weight: bold; }
 +    .world-clocks-button .world-clocks-grid .world-clocks-time:ltr {
 +      text-align: right; }
 +    .world-clocks-button .world-clocks-grid .world-clocks-time:rtl {
 +      text-align: left; }
 +  .world-clocks-button .world-clocks-grid .world-clocks-timezone {
-       color: #9a9a9a; }
++    color: #9b9b9d; }
 +
 +.weather-button .weather-box {
 +  spacing: 6px; }
 +  .weather-button .weather-box .weather-header-box {
 +    spacing: 6px; }
 +    .weather-button .weather-box .weather-header-box .weather-header {
-     color: rgba(255, 255, 255, 0.25); }
++      color: #9b9b9d; }
 +      .weather-button .weather-box .weather-header-box .weather-header.no-location {
 +        color: #ffffff; }
 +      .weather-button .weather-box .weather-header-box .weather-header.location {
 +        font-weight: normal; }
 +  .weather-button .weather-box .weather-grid {
 +    spacing-rows: 6px;
 +    spacing-columns: 12px; }
 +    .weather-button .weather-box .weather-grid .weather-forecast-time {
 +      padding-top: 6px;
 +      padding-bottom: 6px; }
 +    .weather-button .weather-box .weather-grid .weather-forecast-icon {
 +      icon-size: 2.182em;
 +      margin-bottom: 4px; }
 +    .weather-button .weather-box .weather-grid .weather-forecast-temp {
 +      font-weight: bold; }
 +
 +/* Message List */
 +.message-list {
 +  width: 29em;
 +  border: solid rgba(255, 255, 255, 0.1); }
 +  .message-list:ltr {
 +    margin-left: 0;
 +    margin-right: 4px;
 +    padding-right: 6px;
 +    border-right-width: 1px; }
 +  .message-list:rtl {
 +    margin-right: 0;
 +    margin-left: 4px;
 +    padding-left: 6px;
 +    border-left-width: 1px; }
 +  .message-list .message-list-placeholder {
-     color: #9a9a9a;
++    color: rgba(255, 255, 255, 0.45); }
 +    .message-list .message-list-placeholder > StIcon {
 +      icon-size: 96px;
 +      margin-bottom: 12px;
 +      -st-icon-style: symbolic; }
 +
 +.message-list-sections {
 +  spacing: 12px; }
 +  .message-list-sections:ltr {
 +    margin-right: 12px; }
 +  .message-list-sections:rtl {
 +    margin-left: 12px; }
 +
 +.message-list-section,
 +.message-list-section-list {
 +  spacing: 12px; }
 +
 +.message-list-controls {
 +  padding: 12px;
 +  padding-bottom: 6px;
 +  spacing: 6px; }
 +  .message-list-controls .dnd-button {
 +    border-width: 2px;
 +    border-color: transparent;
 +    border-radius: 32px;
 +    border-style: solid; }
 +    .message-list-controls .dnd-button:focus {
 +      border-color: st-transparentize(-st-accent-color, 0.4); }
 +
 +.message {
 +  padding: 6px;
 +  margin: 0;
 +  border-radius: 16px; }
 +  .message .message-header {
 +    spacing: 6px;
-         color: #9a9a9a;
++    color: #9b9b9d;
 +    padding: 0 6px; }
 +    .message .message-header:ltr {
 +      padding-right: 0; }
 +    .message .message-header:rtl {
 +      padding-left: 0; }
 +    .message .message-header .message-source-icon {
 +      icon-size: 1.091em;
 +      -st-icon-style: symbolic; }
 +    .message .message-header .message-header-content {
 +      spacing: 6px;
 +      min-height: 1.637em;
 +      padding-bottom: 6px; }
 +      .message .message-header .message-header-content .message-source-title {
 +        font-weight: bold; }
 +      .message .message-header .message-header-content .event-time {
-     background-color: #5b5b5b;
++        color: #9b9b9d;
 +        padding-bottom: 0.068em; }
 +        .message .message-header .message-header-content .event-time:ltr {
 +          text-align: right; }
 +        .message .message-header .message-header-content .event-time:rtl {
 +          text-align: left; }
 +    .message .message-header .message-expand-button,
 +    .message .message-header .message-close-button {
 +      border-radius: 999px;
 +      color: #ffffff; }
 +    .message .message-header .message-expand-button {
 +      padding: 6px; }
 +    .message .message-header .message-close-button {
 +      margin: 3px;
 +      padding: 4px; }
 +  .message .message-box {
 +    padding: 6px;
 +    margin-top: 0;
 +    spacing: 6px; }
 +    .message .message-box .message-icon {
 +      icon-size: 48px; }
 +      .message .message-box .message-icon:ltr {
 +        margin-right: 6px; }
 +      .message .message-box .message-icon:rtl {
 +        margin-left: 6px; }
 +      .message .message-box .message-icon.message-themed-icon {
 +        border-radius: 999px;
 +        background-color: rgba(255, 255, 255, 0.07);
 +        icon-size: 1.091em;
 +        min-width: 48px;
 +        min-height: 48px; }
 +    .message .message-box:first-child {
 +      margin-top: 12px; }
 +    .message .message-box .message-content {
 +      spacing: 4px; }
 +      .message .message-box .message-content .message-title {
 +        font-weight: bold; }
 +  .message .message-action-bin {
 +    padding: 4px;
 +    spacing: 6px; }
 +    .message .message-action-bin * {
 +      margin: 0 4px; }
 +      .message .message-action-bin *:first-child:ltr {
 +        margin-left: 0; }
 +      .message .message-action-bin *:first-child:rtl {
 +        margin-right: 0; }
 +      .message .message-action-bin *:last-child:ltr {
 +        margin-right: 0; }
 +      .message .message-action-bin *:last-child:rtl {
 +        margin-left: 0; }
 +
 +.url-highlighter {
 +  link-color: st-lighten(-st-accent-color, 20%); }
 +
 +/* Media Controls */
 +.message-media-control {
 +  padding: 0 18px;
 +  border-radius: 8px;
 +  color: #ffffff;
 +  border: 1px solid transparent; }
 +  .message-media-control:hover {
-     background-color: #606060;
++    background-color: #5b5b62;
 +    color: #ffffff; }
 +  .message-media-control:active {
-     color: #a7a7a7; }
++    background-color: #606067;
 +    color: #ffffff; }
 +  .message-media-control:insensitive {
-   color: #9a9a9a; }
++    color: #a8a8aa; }
 +  .message-media-control StIcon {
 +    icon-size: 16px; }
 +
 +.media-message .message-icon {
 +  border-radius: 8px !important; }
 +  .media-message .message-icon.message-themed-icon {
 +    icon-size: 32px !important; }
 +
 +.candidate-popup-content {
 +  padding: 6px;
 +  spacing: 6px;
 +  border-radius: 12px; }
 +
 +.candidate-index {
 +  padding: 0;
 +  padding-right: 6px;
-     background-color: #4e4e4e;
++  color: #9b9b9d; }
 +
 +.candidate-box {
 +  padding: 6px 12px 6px 12px;
 +  border-radius: 8px; }
 +  .candidate-box:selected {
 +    background-color: -st-accent-color;
 +    color: -st-accent-fg-color; }
 +  .candidate-box:hover {
-   background-color: #353535;
++    background-color: #4f4f54;
 +    color: white; }
 +
 +.candidate-page-button-box {
 +  height: 2em; }
 +  .vertical .candidate-page-button-box {
 +    padding-top: 12px; }
 +  .horizontal .candidate-page-button-box {
 +    padding-left: 12px; }
 +
 +.candidate-page-button {
 +  padding: 6px; }
 +  .candidate-page-button StIcon {
 +    icon-size: 16px; }
 +
 +.candidate-page-button-previous {
 +  border-radius: 8px 0px 0px 8px;
 +  border-right-width: 0;
 +  box-shadow: none; }
 +
 +.candidate-page-button-next {
 +  border-radius: 0px 8px 8px 0px;
 +  box-shadow: none; }
 +
 +/* Notifications & Message Tray */
 +.notification-banner {
 +  min-height: 64px;
 +  width: 34em;
 +  box-shadow: 0 2px 4px 2px rgba(0, 0, 0, 0.2);
 +  border-radius: 16px;
 +  margin: 4px; }
 +
 +.notification-buttons-bin {
 +  spacing: 0; }
 +
 +/* Modal Dialogs */
 +.modal-dialog {
-     color: #f6d32d;
-     background-color: rgba(246, 211, 45, 0.1);
++  background-color: #36363a;
 +  border-radius: 18px;
 +  padding: 24px;
 +  spacing: 18px;
 +  box-shadow: 0 12px 8px 12px rgba(0, 0, 0, 0.03); }
 +  .modal-dialog .modal-dialog-content-box {
 +    padding-top: 12px;
 +    spacing: 18px;
 +    max-width: 28em; }
 +  .modal-dialog .modal-dialog-button-box {
 +    padding-top: 6px; }
 +
 +.dialog-list {
 +  spacing: 18px; }
 +  .dialog-list .dialog-list-title {
 +    text-align: center; }
 +  .dialog-list .dialog-list-scrollview {
 +    max-height: 200px; }
 +  .dialog-list .dialog-list-box {
 +    spacing: 1em; }
 +    .dialog-list .dialog-list-box .dialog-list-item {
 +      spacing: 1em; }
 +      .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-title {
 +        font-weight: bold; }
 +      .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description {
 +        color: #f2f2f2; }
 +
 +/* End Session Dialog */
 +.end-session-dialog {
 +  width: 24em; }
 +  .end-session-dialog .end-session-dialog-battery-warning,
 +  .end-session-dialog .dialog-list-title {
-     color: #f6d32d; }
++    color: #cd9309;
++    background-color: rgba(205, 147, 9, 0.1);
 +    padding: 9px;
 +    border-radius: 8px;
 +    margin: 4px 0; }
 +
 +/* Message Dialog */
 +.message-dialog-content {
 +  spacing: 18px; }
 +  .message-dialog-content .message-dialog-title {
 +    text-align: center; }
 +  .message-dialog-content .message-dialog-description {
 +    text-align: center; }
 +
 +/* Run Dialog */
 +.run-dialog {
 +  width: 24em;
 +  padding-bottom: 6px; }
 +  .run-dialog .run-dialog-entry {
 +    padding: 12px 9px; }
 +  .run-dialog .run-dialog-description {
 +    color: #cccccc; }
 +
 +/* Password or Authentication Dialog */
 +.prompt-dialog {
 +  width: 28em; }
 +  .prompt-dialog .prompt-dialog-password-grid {
 +    spacing-rows: 8px;
 +    spacing-columns: 4px; }
 +    .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry {
 +      width: auto; }
 +      .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry:ltr {
 +        margin-left: 20px; }
 +      .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry:rtl {
 +        margin-right: 20px; }
 +  .prompt-dialog .prompt-dialog-password-layout {
 +    spacing: 8px; }
 +  .prompt-dialog .prompt-dialog-password-entry {
 +    width: 20em;
 +    padding: 12px 9px; }
 +  .prompt-dialog .prompt-dialog-error-label,
 +  .prompt-dialog .prompt-dialog-info-label,
 +  .prompt-dialog .prompt-dialog-null-label {
 +    text-align: center; }
 +  .prompt-dialog .prompt-dialog-error-label {
-     color: #f6d32d; }
++    color: #cd9309; }
 +
 +/* Polkit Dialog */
 +.polkit-dialog-user-layout {
 +  text-align: center;
 +  spacing: 8px;
 +  margin-bottom: 6px; }
 +  .polkit-dialog-user-layout .polkit-dialog-user-root-label {
-       background-color: #353535; }
++    color: #cd9309; }
 +
 +/* Audio selection dialog */
 +.audio-device-selection-dialog {
 +  min-width: 24em; }
 +  .audio-device-selection-dialog .audio-selection-box {
 +    spacing: 12px; }
 +    .audio-device-selection-dialog .audio-selection-box .audio-selection-device {
 +      color: #ffffff;
-         box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-         background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); }
++      background-color: #2e2e33;
++      background-color: transparent; }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device:focus {
 +        color: #ffffff;
-           background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); }
++        box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(46, 46, 51, 0.25), 5%); }
 +        .audio-device-selection-dialog .audio-selection-box .audio-selection-device:focus:hover {
-         background-color: st-lighten(#353535, 7%); }
++          background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#2e2e33, 7%), 5%); }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device:hover {
 +        color: #ffffff;
-         background-color: st-lighten(#353535, 9%); }
++        background-color: st-lighten(#2e2e33, 7%); }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active {
 +        color: #ffffff;
-           background-color: st-lighten(st-lighten(#353535, 9%), 7%); }
++        background-color: st-lighten(#2e2e33, 9%); }
 +        .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active:hover {
-           background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); }
++          background-color: st-lighten(st-lighten(#2e2e33, 9%), 7%); }
 +        .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active:focus {
-         background-color: st-lighten(#353535, 8%); }
++          background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#2e2e33, 9%), 5%); }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked {
 +        color: #ffffff;
-           background-color: st-lighten(st-lighten(#353535, 8%), 7%); }
++        background-color: st-lighten(#2e2e33, 8%); }
 +        .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted:hover, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected:hover, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked:hover {
-           background-color: st-lighten(st-lighten(#353535, 8%), 9%); }
++          background-color: st-lighten(st-lighten(#2e2e33, 8%), 7%); }
 +        .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted:active, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected:active, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked:active {
-         background-color: #353535; }
++          background-color: st-lighten(st-lighten(#2e2e33, 8%), 9%); }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device:insensitive {
 +        color: st-transparentize(#ffffff, 0.5);
- .osd-monitor-label {
++        background-color: #2e2e33; }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device:drop {
 +        background-color: st-transparentize(-st-accent-color, 0.8);
 +        box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device .audio-selection-device-box {
 +        padding: 12px;
 +        spacing: 12px; }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device .audio-selection-device-icon {
 +        icon-size: 64px; }
 +
 +/* Welcome dialog */
 +.welcome-dialog-image {
 +  background-image: url("resource:///org/gnome/shell/theme/gnome-shell-start.svg");
 +  background-size: contain;
 +  /* Reasonable maximum dimensions */
 +  height: 300px;
 +  width: 300px; }
 +
 +/* Access portal dialog */
 +.access-dialog {
 +  text-align: center; }
 +
 +/* OSD */
 +.osd-window {
 +  text-align: center;
 +  font-weight: bold;
 +  spacing: 12px;
 +  padding: 12px 18px;
 +  margin-bottom: 4em; }
 +  .osd-window > * {
 +    spacing: 8px; }
 +  .osd-window StIcon {
 +    icon-size: 32px; }
 +  .osd-window StLabel:ltr {
 +    margin-right: 6px; }
 +  .osd-window StLabel:rtl {
 +    margin-left: 6px; }
 +  .osd-window .level {
 +    margin-bottom: 4px;
 +    min-width: 160px;
 +    -barlevel-height: 6px;
 +    -barlevel-background-color: rgba(255, 255, 255, 0.1);
 +    -barlevel-active-background-color: #ffffff;
 +    -barlevel-overdrive-color: #c01c28;
 +    -barlevel-overdrive-separator-width: 3px; }
 +    .osd-window .level:first-child {
 +      margin-bottom: 0; }
 +    .osd-window .level:ltr {
 +      margin-right: 6px; }
 +    .osd-window .level:rtl {
 +      margin-left: 6px; }
 +
-     background-color: #353535; }
++.osd-monitor-label, .osd-break-countdown-label {
 +  background-color: -st-accent-color;
 +  color: -st-accent-fg-color;
 +  border-radius: 16px;
 +  font-size: 3em;
 +  font-weight: bold;
 +  font-feature-settings: "tnum";
 +  margin: 12px;
 +  padding: 12px;
 +  text-align: center;
 +  min-width: 1.5em; }
 +
 +/* Pad OSD */
 +.pad-osd-window {
 +  padding: 32px;
 +  background-color: rgba(0, 0, 0, 0.8); }
 +  .pad-osd-window .pad-osd-title-box {
 +    spacing: 12px; }
 +  .pad-osd-window .pad-osd-title-menu-box {
 +    spacing: 6px; }
 +
 +.combo-box-label {
 +  width: 15em; }
 +
 +/* App Switcher */
 +.switcher-popup {
 +  padding: 0;
 +  spacing: 24px; }
 +
 +.switcher-list {
 +  padding: 12px;
 +  border-radius: 28px;
 +  box-shadow: 0 8px 8px 0 rgba(0, 0, 0, 0.2); }
 +  .switcher-list .switcher-list-item-container {
 +    spacing: 12px; }
 +  .switcher-list .item-box {
 +    color: #ffffff;
-       box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-       background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); }
++    background-color: #2e2e33;
++    background-color: transparent; }
 +    .switcher-list .item-box:focus {
 +      color: #ffffff;
-         background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); }
++      box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(46, 46, 51, 0.25), 5%); }
 +      .switcher-list .item-box:focus:hover {
-       background-color: st-lighten(#353535, 7%); }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#2e2e33, 7%), 5%); }
 +    .switcher-list .item-box:hover {
 +      color: #ffffff;
-       background-color: st-lighten(#353535, 9%); }
++      background-color: st-lighten(#2e2e33, 7%); }
 +    .switcher-list .item-box:active {
 +      color: #ffffff;
-         background-color: st-lighten(st-lighten(#353535, 9%), 7%); }
++      background-color: st-lighten(#2e2e33, 9%); }
 +      .switcher-list .item-box:active:hover {
-         background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); }
++        background-color: st-lighten(st-lighten(#2e2e33, 9%), 7%); }
 +      .switcher-list .item-box:active:focus {
-       background-color: st-lighten(#353535, 8%); }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#2e2e33, 9%), 5%); }
 +    .switcher-list .item-box:highlighted, .switcher-list .item-box:selected, .switcher-list .item-box:checked {
 +      color: #ffffff;
-         background-color: st-lighten(st-lighten(#353535, 8%), 7%); }
++      background-color: st-lighten(#2e2e33, 8%); }
 +      .switcher-list .item-box:highlighted:hover, .switcher-list .item-box:selected:hover, .switcher-list .item-box:checked:hover {
-         background-color: st-lighten(st-lighten(#353535, 8%), 9%); }
++        background-color: st-lighten(st-lighten(#2e2e33, 8%), 7%); }
 +      .switcher-list .item-box:highlighted:active, .switcher-list .item-box:selected:active, .switcher-list .item-box:checked:active {
-       background-color: #353535; }
++        background-color: st-lighten(st-lighten(#2e2e33, 8%), 9%); }
 +    .switcher-list .item-box:insensitive {
 +      color: st-transparentize(#ffffff, 0.5);
-       background-color: #4e4e4e; }
++      background-color: #2e2e33; }
 +    .switcher-list .item-box:drop {
 +      background-color: st-transparentize(-st-accent-color, 0.8);
 +      box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
 +    .switcher-list .item-box:hover {
 +      background: none; }
 +    .switcher-list .item-box:selected {
 +      background-color: rgba(255, 255, 255, 0.2); }
 +  .switcher-list .separator {
 +    width: 1px;
 +    background: rgba(255, 255, 255, 0.1); }
 +  .switcher-list .thumbnail-box {
 +    padding: 2px;
 +    spacing: 6px; }
 +  .switcher-list .thumbnail {
 +    width: 256px;
 +    border-radius: 8px; }
 +
 +.switcher-arrow {
 +  border-color: rgba(255, 255, 255, 0.8);
 +  color: rgba(255, 255, 255, 0.8); }
 +  .switcher-arrow:highlighted {
 +    border-color: #ffffff;
 +    color: #ffffff; }
 +
 +.input-source-switcher-symbol {
 +  font-size: 34pt;
 +  width: 96px;
 +  height: 96px; }
 +
 +.cycler-highlight {
 +  border: 5px solid -st-accent-color; }
 +
 +/* Workspace Switcher */
 +.workspace-switcher {
 +  margin-bottom: 4em;
 +  spacing: 12px;
 +  padding: 12px 18px; }
 +
 +.ws-switcher-indicator {
 +  background-color: rgba(255, 255, 255, 0.5);
 +  padding: 2.6666666667px;
 +  margin: 13.3333333333px;
 +  border-radius: 32px; }
 +  .ws-switcher-indicator:active {
 +    background-color: #ffffff;
 +    padding: 5.3333333333px;
 +    margin: 10.6666666667px; }
 +
 +.screenshot-ui-panel {
 +  border-radius: 32px;
 +  padding: 18px;
 +  padding-bottom: 12px;
 +  margin-bottom: 4em;
 +  spacing: 12px; }
 +
 +.screenshot-ui-close-button {
 +  padding: 6px !important;
 +  margin-top: 12px;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2); }
 +  .screenshot-ui-close-button.left {
 +    margin-left: 12px; }
 +  .screenshot-ui-close-button.right {
 +    margin-right: 12px; }
 +
 +.screenshot-ui-type-button {
 +  min-width: 48px;
 +  padding: 12px 18px;
 +  border-radius: 14px; }
 +  .screenshot-ui-type-button .icon-label-button-container {
 +    spacing: 0.409em; }
 +    .screenshot-ui-type-button .icon-label-button-container > StIcon {
 +      icon-size: 32px; }
 +
 +.screenshot-ui-capture-button {
 +  width: 32px;
 +  height: 32px;
 +  border-radius: 999px;
 +  border: 4px #ffffff;
 +  padding: 4px; }
 +  .screenshot-ui-capture-button .screenshot-ui-capture-button-circle {
 +    background-color: #ffffff;
 +    transition-duration: 200ms;
 +    border-radius: 999px; }
 +    .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:hover, .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:focus {
-     color: #353535; }
++      background-color: #4f4f54; }
 +  .screenshot-ui-capture-button:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:focus .screenshot-ui-capture-button-circle {
 +    background-color: #cccccc; }
 +  .screenshot-ui-capture-button:active .screenshot-ui-capture-button-circle {
 +    background-color: gray; }
 +  .screenshot-ui-capture-button:cast .screenshot-ui-capture-button-circle {
 +    background-color: #c01c28; }
 +  .screenshot-ui-capture-button:cast:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:cast:focus .screenshot-ui-capture-button-circle {
 +    background-color: #d61f2d; }
 +  .screenshot-ui-capture-button:cast:active .screenshot-ui-capture-button-circle {
 +    background-color: #a11722; }
 +
 +.screenshot-ui-shot-cast-container {
 +  background-color: rgba(255, 255, 255, 0.1);
 +  border-radius: 999px;
 +  padding: 3px;
 +  spacing: 3px; }
 +
 +.screenshot-ui-shot-cast-button {
 +  padding: 6px 12px;
 +  background-color: transparent;
 +  border-radius: 999px; }
 +  .screenshot-ui-shot-cast-button > StIcon {
 +    icon-size: 16px; }
 +  .screenshot-ui-shot-cast-button:hover, .screenshot-ui-shot-cast-button:focus {
 +    background-color: rgba(255, 255, 255, 0.2); }
 +  .screenshot-ui-shot-cast-button:active {
 +    background-color: rgba(255, 255, 255, 0.5); }
 +  .screenshot-ui-shot-cast-button:checked {
 +    background-color: #ffffff;
-   background-color: #282828; }
++    color: #2e2e33; }
 +  .screenshot-ui-shot-cast-button:insensitive {
 +    color: rgba(255, 255, 255, 0.5); }
 +
 +.screenshot-ui-area-indicator-shade {
 +  background-color: rgba(0, 0, 0, 0.3); }
 +
 +.screenshot-ui-area-selector .screenshot-ui-area-indicator-shade {
 +  background-color: rgba(0, 0, 0, 0.5); }
 +
 +.screenshot-ui-area-selector .screenshot-ui-area-indicator-selection {
 +  border: 2px white; }
 +
 +.screenshot-ui-area-selector-handle {
 +  border-radius: 999px;
 +  background-color: white;
 +  box-shadow: 0 1px 3px 2px rgba(0, 0, 0, 0.2);
 +  width: 24px;
 +  height: 24px; }
 +
 +.screenshot-ui-window-selector {
-       color: whitesmoke;
++  background-color: #222226; }
 +  .screenshot-ui-window-selector .screenshot-ui-window-selector-window-container {
 +    margin: 100px; }
 +  .screenshot-ui-window-selector:primary-monitor .screenshot-ui-window-selector-window-container {
 +    margin-bottom: 200px; }
 +
 +.screenshot-ui-window-selector-window-border {
 +  transition-duration: 200ms;
 +  border-radius: 16px;
 +  border: 6px transparent; }
 +
 +.screenshot-ui-window-selector-check {
 +  transition-duration: 200ms;
 +  color: transparent;
 +  border-radius: 999px;
 +  border-width: 12px;
 +  icon-size: 24px; }
 +
 +.screenshot-ui-window-selector-window:hover .screenshot-ui-window-selector-window-border {
 +  border-color: st-darken(-st-accent-color, 15%); }
 +
 +.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-window-border {
 +  border-color: -st-accent-color;
 +  background-color: st-transparentize(-st-accent-color, 0.8); }
 +
 +.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-check {
 +  color: -st-accent-fg-color;
 +  background-color: -st-accent-color; }
 +
 +.screenshot-ui-screen-selector {
 +  transition-duration: 200ms;
 +  background-color: rgba(0, 0, 0, 0.5); }
 +  .screenshot-ui-screen-selector:hover {
 +    background-color: rgba(0, 0, 0, 0.3); }
 +  .screenshot-ui-screen-selector:active {
 +    background-color: rgba(0, 0, 0, 0.7); }
 +  .screenshot-ui-screen-selector:checked {
 +    background-color: transparent;
 +    border: 2px white; }
 +
 +.screenshot-ui-tooltip {
 +  text-align: center;
 +  -y-offset: 24px; }
 +
 +/* Top Bar */
 +#panel {
 +  background-color: #000000;
 +  font-weight: bold;
 +  height: 2.2em;
 +  transition-duration: 250ms; }
 +  #panel .panel-button {
 +    transition-duration: 150ms;
 +    border: 3px solid transparent;
 +    background-color: transparent;
 +    border-radius: 999px;
 +    font-weight: bold;
 +    color: #ffffff;
 +    box-shadow: inset 0 0 0 100px transparent;
 +    -natural-hpadding: 12px;
 +    -minimum-hpadding: 6px; }
 +    #panel .panel-button:focus, #panel .panel-button:hover {
 +      box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
 +    #panel .panel-button:active, #panel .panel-button:checked {
 +      box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
 +      #panel .panel-button:active:hover, #panel .panel-button:checked:hover {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
 +    #panel .panel-button .system-status-icon {
 +      icon-size: 1.091em;
 +      padding: 0 6px;
 +      margin: 0 4px; }
 +    #panel .panel-button .app-menu-icon {
 +      -st-icon-style: symbolic; }
 +    #panel .panel-button .panel-status-menu-box,
 +    #panel .panel-button .panel-status-indicators-box {
 +      spacing: 4px; }
 +      #panel .panel-button .panel-status-menu-box > .system-status-icon,
 +      #panel .panel-button .panel-status-indicators-box > .system-status-icon {
 +        padding: 0; }
 +    #panel .panel-button#panelActivities StBoxLayout {
 +      padding: 0 0.2045em;
 +      spacing: 5px; }
 +    #panel .panel-button#panelActivities .workspace-dot {
 +      border-radius: 999px;
 +      min-width: 0.5455em;
 +      min-height: 0.5455em;
 +      background-color: #ffffff; }
 +    #panel .panel-button.screen-recording-indicator StBoxLayout, #panel .panel-button.screen-sharing-indicator StBoxLayout {
 +      spacing: 0.409em; }
 +    #panel .panel-button.screen-recording-indicator StIcon, #panel .panel-button.screen-sharing-indicator StIcon {
 +      icon-size: 1.091em; }
 +    #panel .panel-button.screen-recording-indicator {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
-       color: whitesmoke;
++      color: #fafafb;
 +      box-shadow: inset 0 0 0 100px #c01c28; }
 +      #panel .panel-button.screen-recording-indicator:focus, #panel .panel-button.screen-recording-indicator:hover {
 +        box-shadow: inset 0 0 0 100px #d61f2d; }
 +      #panel .panel-button.screen-recording-indicator:active, #panel .panel-button.screen-recording-indicator:checked {
 +        box-shadow: inset 0 0 0 100px #e02a37; }
 +        #panel .panel-button.screen-recording-indicator:active:hover, #panel .panel-button.screen-recording-indicator:checked:hover {
 +          box-shadow: inset 0 0 0 100px #e13340; }
 +    #panel .panel-button.screen-sharing-indicator {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
-       color: whitesmoke;
++      color: #fafafb;
 +      box-shadow: inset 0 0 0 100px #ff7800; }
 +      #panel .panel-button.screen-sharing-indicator:focus, #panel .panel-button.screen-sharing-indicator:hover {
 +        box-shadow: inset 0 0 0 100px #ff861a; }
 +      #panel .panel-button.screen-sharing-indicator:active, #panel .panel-button.screen-sharing-indicator:checked {
 +        box-shadow: inset 0 0 0 100px #ff902e; }
 +        #panel .panel-button.screen-sharing-indicator:active:hover, #panel .panel-button.screen-sharing-indicator:checked:hover {
 +          box-shadow: inset 0 0 0 100px #ff9638; }
 +    #panel .panel-button.clock-display {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
 +      color: #ffffff;
 +      box-shadow: inset 0 0 0 100px transparent;
 +      background: none !important;
 +      box-shadow: none !important;
 +      border: none !important; }
 +      #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:hover {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
 +      #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:checked {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
 +        #panel .panel-button.clock-display:active:hover, #panel .panel-button.clock-display:checked:hover {
 +          box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
 +      #panel .panel-button.clock-display .clock {
 +        transition-duration: 150ms;
 +        border: 3px solid transparent;
 +        border-radius: 999px; }
 +      #panel .panel-button.clock-display:focus .clock, #panel .panel-button.clock-display:hover .clock {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
 +      #panel .panel-button.clock-display:active .clock, #panel .panel-button.clock-display:checked .clock {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
 +        #panel .panel-button.clock-display:active .clock:hover, #panel .panel-button.clock-display:checked .clock:hover {
 +          box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
 +      #panel .panel-button.clock-display .messages-indicator {
 +        icon-size: 1.091em; }
 +  #panel:overview, #panel.unlock-screen, #panel.login-screen {
 +    background-color: transparent; }
 +    #panel:overview .panel-button.screen-recording-indicator, #panel.unlock-screen .panel-button.screen-recording-indicator, #panel.login-screen .panel-button.screen-recording-indicator {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
-       color: whitesmoke;
++      color: #fafafb;
 +      box-shadow: inset 0 0 0 100px #c01c28; }
 +      #panel:overview .panel-button.screen-recording-indicator:focus, #panel:overview .panel-button.screen-recording-indicator:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:focus, #panel.unlock-screen .panel-button.screen-recording-indicator:hover, #panel.login-screen .panel-button.screen-recording-indicator:focus, #panel.login-screen .panel-button.screen-recording-indicator:hover {
 +        box-shadow: inset 0 0 0 100px #d61f2d; }
 +      #panel:overview .panel-button.screen-recording-indicator:active, #panel:overview .panel-button.screen-recording-indicator:checked, #panel.unlock-screen .panel-button.screen-recording-indicator:active, #panel.unlock-screen .panel-button.screen-recording-indicator:checked, #panel.login-screen .panel-button.screen-recording-indicator:active, #panel.login-screen .panel-button.screen-recording-indicator:checked {
 +        box-shadow: inset 0 0 0 100px #e02a37; }
 +        #panel:overview .panel-button.screen-recording-indicator:active:hover, #panel:overview .panel-button.screen-recording-indicator:checked:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:active:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:checked:hover, #panel.login-screen .panel-button.screen-recording-indicator:active:hover, #panel.login-screen .panel-button.screen-recording-indicator:checked:hover {
 +          box-shadow: inset 0 0 0 100px #e13340; }
 +    #panel:overview .panel-button.screen-sharing-indicator, #panel.unlock-screen .panel-button.screen-sharing-indicator, #panel.login-screen .panel-button.screen-sharing-indicator {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
-     color: whitesmoke;
++      color: #fafafb;
 +      box-shadow: inset 0 0 0 100px #ff7800; }
 +      #panel:overview .panel-button.screen-sharing-indicator:focus, #panel:overview .panel-button.screen-sharing-indicator:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:focus, #panel.unlock-screen .panel-button.screen-sharing-indicator:hover, #panel.login-screen .panel-button.screen-sharing-indicator:focus, #panel.login-screen .panel-button.screen-sharing-indicator:hover {
 +        box-shadow: inset 0 0 0 100px #ff861a; }
 +      #panel:overview .panel-button.screen-sharing-indicator:active, #panel:overview .panel-button.screen-sharing-indicator:checked, #panel.unlock-screen .panel-button.screen-sharing-indicator:active, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked, #panel.login-screen .panel-button.screen-sharing-indicator:active, #panel.login-screen .panel-button.screen-sharing-indicator:checked {
 +        box-shadow: inset 0 0 0 100px #ff902e; }
 +        #panel:overview .panel-button.screen-sharing-indicator:active:hover, #panel:overview .panel-button.screen-sharing-indicator:checked:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:active:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked:hover, #panel.login-screen .panel-button.screen-sharing-indicator:active:hover, #panel.login-screen .panel-button.screen-sharing-indicator:checked:hover {
 +          box-shadow: inset 0 0 0 100px #ff9638; }
 +  #panel.unlock-screen .panel-button, #panel.login-screen .panel-button {
 +    transition-duration: 150ms;
 +    border: 3px solid transparent;
 +    background-color: transparent;
 +    border-radius: 999px;
 +    font-weight: bold;
 +    color: #ffffff;
 +    box-shadow: inset 0 0 0 100px transparent; }
 +    #panel.unlock-screen .panel-button:focus, #panel.unlock-screen .panel-button:hover, #panel.login-screen .panel-button:focus, #panel.login-screen .panel-button:hover {
 +      box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
 +    #panel.unlock-screen .panel-button:active, #panel.unlock-screen .panel-button:checked, #panel.login-screen .panel-button:active, #panel.login-screen .panel-button:checked {
 +      box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
 +      #panel.unlock-screen .panel-button:active:hover, #panel.unlock-screen .panel-button:checked:hover, #panel.login-screen .panel-button:active:hover, #panel.login-screen .panel-button:checked:hover {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
 +    #panel.unlock-screen .panel-button.clock-display, #panel.login-screen .panel-button.clock-display {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
 +      color: #ffffff;
 +      box-shadow: inset 0 0 0 100px transparent;
 +      background: none !important;
 +      box-shadow: none !important;
 +      border: none !important; }
 +      #panel.unlock-screen .panel-button.clock-display:focus, #panel.unlock-screen .panel-button.clock-display:hover, #panel.login-screen .panel-button.clock-display:focus, #panel.login-screen .panel-button.clock-display:hover {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
 +      #panel.unlock-screen .panel-button.clock-display:active, #panel.unlock-screen .panel-button.clock-display:checked, #panel.login-screen .panel-button.clock-display:active, #panel.login-screen .panel-button.clock-display:checked {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
 +        #panel.unlock-screen .panel-button.clock-display:active:hover, #panel.unlock-screen .panel-button.clock-display:checked:hover, #panel.login-screen .panel-button.clock-display:active:hover, #panel.login-screen .panel-button.clock-display:checked:hover {
 +          box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
 +      #panel.unlock-screen .panel-button.clock-display .clock, #panel.login-screen .panel-button.clock-display .clock {
 +        transition-duration: 150ms;
 +        border: 3px solid transparent;
 +        border-radius: 999px; }
 +      #panel.unlock-screen .panel-button.clock-display:focus .clock, #panel.unlock-screen .panel-button.clock-display:hover .clock, #panel.login-screen .panel-button.clock-display:focus .clock, #panel.login-screen .panel-button.clock-display:hover .clock {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
 +      #panel.unlock-screen .panel-button.clock-display:active .clock, #panel.unlock-screen .panel-button.clock-display:checked .clock, #panel.login-screen .panel-button.clock-display:active .clock, #panel.login-screen .panel-button.clock-display:checked .clock {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
 +        #panel.unlock-screen .panel-button.clock-display:active .clock:hover, #panel.unlock-screen .panel-button.clock-display:checked .clock:hover, #panel.login-screen .panel-button.clock-display:active .clock:hover, #panel.login-screen .panel-button.clock-display:checked .clock:hover {
 +          box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
 +  #panel:overview .panel-button {
 +    transition-duration: 150ms;
 +    border: 3px solid transparent;
 +    background-color: transparent;
 +    border-radius: 999px;
 +    font-weight: bold;
-       box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.17); }
++    color: #fafafb;
 +    box-shadow: inset 0 0 0 100px transparent; }
 +    #panel:overview .panel-button:focus, #panel:overview .panel-button:hover {
-       box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.28); }
++      box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.17); }
 +    #panel:overview .panel-button:active, #panel:overview .panel-button:checked {
-         box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.32); }
++      box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.28); }
 +      #panel:overview .panel-button:active:hover, #panel:overview .panel-button:checked:hover {
-       background-color: whitesmoke; }
++        box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.32); }
 +    #panel:overview .panel-button#panelActivities .workspace-dot {
-       color: whitesmoke;
++      background-color: #fafafb; }
 +    #panel:overview .panel-button.clock-display {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
-         box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.17); }
++      color: #fafafb;
 +      box-shadow: inset 0 0 0 100px transparent;
 +      background: none !important;
 +      box-shadow: none !important;
 +      border: none !important; }
 +      #panel:overview .panel-button.clock-display:focus, #panel:overview .panel-button.clock-display:hover {
-         box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.28); }
++        box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.17); }
 +      #panel:overview .panel-button.clock-display:active, #panel:overview .panel-button.clock-display:checked {
-           box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.32); }
++        box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.28); }
 +        #panel:overview .panel-button.clock-display:active:hover, #panel:overview .panel-button.clock-display:checked:hover {
-         box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.17); }
++          box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.32); }
 +      #panel:overview .panel-button.clock-display .clock {
 +        transition-duration: 150ms;
 +        border: 3px solid transparent;
 +        border-radius: 999px; }
 +      #panel:overview .panel-button.clock-display:focus .clock, #panel:overview .panel-button.clock-display:hover .clock {
-         box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.28); }
++        box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.17); }
 +      #panel:overview .panel-button.clock-display:active .clock, #panel:overview .panel-button.clock-display:checked .clock {
-           box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.32); }
++        box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.28); }
 +        #panel:overview .panel-button.clock-display:active .clock:hover, #panel:overview .panel-button.clock-display:checked .clock:hover {
- .quick-toggle, .quick-menu-toggle {
++          box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.32); }
 +  #panel .panel-status-indicators-box,
 +  #panel .panel-status-menu-box {
 +    spacing: 2px; }
 +  #panel .power-status.panel-status-indicators-box {
 +    spacing: 0; }
 +  #panel .privacy-indicator {
 +    color: #ff7800; }
 +
 +#appMenu {
 +  spacing: 0.409em; }
 +  #appMenu .label-shadow {
 +    color: transparent; }
 +
 +#appMenu .panel-status-menu-box {
 +  padding: 0 0.409em;
 +  spacing: 0.409em; }
 +
 +.clock-display-box {
 +  spacing: 2px; }
 +  .clock-display-box .clock {
 +    padding-left: 0.818em;
 +    padding-right: 0.818em; }
 +
 +/* Activities Ripple */
 +.ripple-box {
 +  background-color: rgba(255, 255, 255, 0.2);
 +  box-shadow: 0 0 2px 2px rgba(255, 255, 255, 0.2);
 +  width: 52px;
 +  height: 52px;
 +  border-radius: 0 0 52px 0; }
 +  .ripple-box:rtl {
 +    border-radius: 0 0 0 52px; }
 +
 +.quick-settings {
 +  padding: 18px;
 +  border-radius: 36px; }
 +  .quick-settings .icon-button, .quick-settings .login-dialog-button.cancel-button, .quick-settings .login-dialog-button.switch-user-button, .quick-settings .login-dialog-button.login-dialog-session-list-button, .quick-settings .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-settings .pager-button, .quick-settings .message .message-header .message-expand-button, .message .message-header .quick-settings .message-expand-button,
 +  .quick-settings .message .message-header .message-close-button,
 +  .message .message-header .quick-settings .message-close-button, .quick-settings .screenshot-ui-show-pointer-button, .quick-settings .button {
 +    padding: 10.5px; }
 +
 +.quick-settings-grid {
 +  spacing-rows: 12px;
 +  spacing-columns: 12px; }
 +
-   min-height: 3.273em;
-   border: none; }
++.quick-toggle, .quick-toggle-has-menu {
 +  border-radius: 999px;
 +  min-width: 12em;
 +  max-width: 12em;
-   background-color: none;
++  min-height: 3.273em; }
 +
 +.quick-toggle {
-   .quick-toggle .quick-toggle-title {
-     font-weight: bold; }
-   .quick-toggle StBoxLayout > .quick-toggle-subtitle {
 +  /* Move padding into the box; this is to allow menu arrows
 +     to extend to the border */ }
 +  .quick-toggle > StBoxLayout {
 +    spacing: 9px; }
 +  .quick-toggle.button {
 +    padding: 0; }
 +  .quick-toggle > StBoxLayout {
 +    padding: 0 12px; }
 +  .quick-toggle:ltr > StBoxLayout {
 +    padding-left: 15px; }
 +  .quick-toggle:rtl > StBoxLayout {
 +    padding-right: 15px; }
- .quick-menu-toggle .quick-toggle {
++  .quick-toggle .quick-toggle-subtitle {
 +    font-weight: normal; }
 +  .quick-toggle .quick-toggle-icon {
 +    icon-size: 1.091em; }
 +
-   .quick-menu-toggle .quick-toggle:ltr {
++.quick-toggle-has-menu .quick-toggle {
 +  min-width: auto;
 +  max-width: auto; }
-   .quick-menu-toggle .quick-toggle:ltr > StBoxLayout {
-     padding-right: 0.6135em; }
-   .quick-menu-toggle .quick-toggle:rtl {
++  .quick-toggle-has-menu .quick-toggle:ltr {
 +    border-radius: 999px 0 0 999px; }
-   .quick-menu-toggle .quick-toggle:rtr > StBoxLayout {
-     padding-left: 0.6135em; }
-   .quick-menu-toggle .quick-toggle:ltr:last-child {
++    .quick-toggle-has-menu .quick-toggle:ltr > StBoxLayout {
++      padding-right: 0.6135em; }
++  .quick-toggle-has-menu .quick-toggle:rtl {
 +    border-radius: 0 999px 999px 0; }
-   .quick-menu-toggle .quick-toggle:rtl:last-child {
++    .quick-toggle-has-menu .quick-toggle:rtl > StBoxLayout {
++      padding-left: 0.6135em; }
++  .quick-toggle-has-menu .quick-toggle:ltr:last-child {
 +    border-radius: 999px; }
- .quick-menu-toggle .quick-toggle-arrow {
-   padding: 0.409em 0.71575em;
-   border-width: 0;
-   border-color: rgba(255, 255, 255, 0.25); }
-   .quick-menu-toggle .quick-toggle-arrow:checked {
-     border-color: st-lighten(-st-accent-color, 15%); }
-   .quick-menu-toggle .quick-toggle-arrow:ltr {
-     border-radius: 0 999px 999px 0;
-     border-left-width: 1px; }
-   .quick-menu-toggle .quick-toggle-arrow:rtl {
-     border-radius: 999px 0 0 999px;
-     border-right-width: 1px; }
++  .quick-toggle-has-menu .quick-toggle:rtl:last-child {
 +    border-radius: 999px; }
 +
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 9%), 5%); }
++.quick-toggle-has-menu .quick-toggle-menu-button {
++  padding: 0.409em 0.71575em; }
++  .quick-toggle-has-menu .quick-toggle-menu-button:ltr {
++    border-radius: 0 999px 999px 0; }
++  .quick-toggle-has-menu .quick-toggle-menu-button:rtl {
++    border-radius: 999px 0 0 999px; }
++
++.quick-toggle-has-menu .quick-toggle-separator {
++  width: 1px; }
++
++.quick-toggle-has-menu .quick-toggle-menu-button {
++  color: #ffffff;
++  background-color: st-mix(#ffffff, #4a4a4f, 9%); }
++  .quick-toggle-has-menu .quick-toggle-menu-button:focus {
++    color: #ffffff;
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#ffffff, #4a4a4f, 9%), 5%); }
++    .quick-toggle-has-menu .quick-toggle-menu-button:focus:hover {
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #4a4a4f, 9%), 4%), 5%); }
++  .quick-toggle-has-menu .quick-toggle-menu-button:hover {
++    color: #ffffff;
++    background-color: st-lighten(st-mix(#ffffff, #4a4a4f, 9%), 4%); }
++  .quick-toggle-has-menu .quick-toggle-menu-button:active {
++    color: #ffffff;
++    background-color: st-lighten(st-mix(#ffffff, #4a4a4f, 9%), 9%); }
++    .quick-toggle-has-menu .quick-toggle-menu-button:active:hover {
++      background-color: st-lighten(st-lighten(st-mix(#ffffff, #4a4a4f, 9%), 9%), 4%); }
++    .quick-toggle-has-menu .quick-toggle-menu-button:active:focus {
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #4a4a4f, 9%), 9%), 5%); }
++  .quick-toggle-has-menu .quick-toggle-menu-button:checked {
++    color: -st-accent-fg-color;
++    background-color: st-mix(-st-accent-color, #ffffff, 85%); }
++    .quick-toggle-has-menu .quick-toggle-menu-button:checked:focus {
++      color: -st-accent-fg-color;
++      box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++      box-shadow: inset 0 0 0 2px st-transparentize(st-lighten(-st-accent-color, 30%), 0.2) !important;
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(-st-accent-color, #ffffff, 85%), 5%); }
++      .quick-toggle-has-menu .quick-toggle-menu-button:checked:focus:hover {
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(-st-accent-color, #ffffff, 85%), 4%), 5%); }
++    .quick-toggle-has-menu .quick-toggle-menu-button:checked:hover {
++      color: -st-accent-fg-color;
++      background-color: st-lighten(st-mix(-st-accent-color, #ffffff, 85%), 4%); }
++    .quick-toggle-has-menu .quick-toggle-menu-button:checked:active {
++      color: -st-accent-fg-color;
++      background-color: st-lighten(st-mix(-st-accent-color, #ffffff, 85%), 9%); }
++      .quick-toggle-has-menu .quick-toggle-menu-button:checked:active:hover {
++        background-color: st-lighten(st-lighten(st-mix(-st-accent-color, #ffffff, 85%), 9%), 4%); }
++      .quick-toggle-has-menu .quick-toggle-menu-button:checked:active:focus {
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(-st-accent-color, #ffffff, 85%), 9%), 5%); }
++
++.quick-toggle-has-menu:checked .quick-toggle-separator {
++  background-color: st-mix(-st-accent-fg-color, -st-accent-color, 30%); }
++
++.quick-toggle-has-menu .quick-toggle-separator {
++  background-color: rgba(255, 255, 255, 0.25); }
 +
 +.quick-slider > StBoxLayout {
 +  spacing: 6px; }
 +
 +.quick-slider .icon-button, .quick-slider .login-dialog-button.cancel-button, .quick-slider .login-dialog-button.switch-user-button, .quick-slider .login-dialog-button.login-dialog-session-list-button, .quick-slider .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-slider .pager-button, .quick-slider .message .message-header .message-expand-button, .message .message-header .quick-slider .message-expand-button,
 +.quick-slider .message .message-header .message-close-button,
 +.message .message-header .quick-slider .message-close-button, .quick-slider .screenshot-ui-show-pointer-button {
 +  padding: 6px; }
 +
 +.quick-slider .slider-bin {
 +  padding: 6px;
 +  border-radius: 999px; }
 +  .quick-slider .slider-bin:focus {
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 4%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#ffffff, #36363a, 9%), 5%); }
 +    .quick-slider .slider-bin:focus:hover {
-     background-color: st-mix(#ffffff, #353535, 9%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #36363a, 9%), 4%), 5%); }
 +
 +.quick-toggle-menu {
 +  border-radius: 24px;
 +  margin: 12px 18px 0; }
 +  .quick-toggle-menu:insensitive {
 +    color: #ffffff;
-     background-color: st-mix(#ffffff, #353535, 9%);
++    background-color: st-mix(#ffffff, #36363a, 9%); }
 +  .quick-toggle-menu .popup-menu-item > StIcon {
 +    -st-icon-style: symbolic;
 +    icon-size: 1.091em; }
 +  .quick-toggle-menu .header {
 +    spacing-rows: 3px;
 +    spacing-columns: 12px;
 +    padding-bottom: 12px; }
 +    .quick-toggle-menu .header .icon {
 +      icon-size: 1.6365em;
 +      border-radius: 999px;
 +      padding: 9px;
 +      background-color: rgba(255, 255, 255, 0.2); }
 +      .quick-toggle-menu .header .icon.active {
 +        background-color: -st-accent-color;
 +        color: -st-accent-fg-color; }
 +
 +.quick-settings-system-item > StBoxLayout {
 +  spacing: 12px; }
 +
 +.quick-settings-system-item .power-item {
 +  min-height: 0;
 +  min-width: 0; }
 +  .quick-settings-system-item .power-item:insensitive {
 +    color: #ffffff;
-   background-color: #282828; }
++    background-color: st-mix(#ffffff, #36363a, 9%);
 +    background-color: transparent; }
 +
 +.nm-network-item .wireless-secure-icon {
 +  icon-size: 0.5455em; }
 +
 +.bt-device-item .popup-menu-icon {
 +  -st-icon-style: symbolic; }
 +
 +.bt-menu-placeholder.popup-menu-item {
 +  text-align: center;
 +  padding: 2em 4em; }
 +
 +.device-subtitle {
 +  color: rgba(255, 255, 255, 0.5); }
 +
 +.keyboard-brightness-level {
 +  spacing: 6px; }
 +
 +.background-apps-quick-toggle {
 +  min-height: 2.728em;
 +  background-color: transparent; }
 +  .background-apps-quick-toggle StIcon {
 +    icon-size: 1.091em !important; }
 +
 +.background-app-item .popup-menu-icon {
 +  icon-size: 32px !important;
 +  -st-icon-style: regular !important; }
 +
 +.background-app-item .icon-button, .background-app-item .login-dialog-button.cancel-button, .background-app-item .login-dialog-button.switch-user-button, .background-app-item .login-dialog-button.login-dialog-session-list-button, .background-app-item .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .background-app-item .pager-button, .background-app-item .message .message-header .message-expand-button, .message .message-header .background-app-item .message-expand-button,
 +.background-app-item .message .message-header .message-close-button,
 +.message .message-header .background-app-item .message-close-button, .background-app-item .screenshot-ui-show-pointer-button {
 +  padding: 6px;
 +  background-color: rgba(255, 255, 255, 0.13); }
 +  .background-app-item .icon-button:hover, .background-app-item .login-dialog-button.cancel-button:hover, .background-app-item .login-dialog-button.switch-user-button:hover, .background-app-item .login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .calendar .calendar-month-header .pager-button:hover, .calendar .calendar-month-header .background-app-item .pager-button:hover, .background-app-item .message .message-header .message-expand-button:hover, .message .message-header .background-app-item .message-expand-button:hover,
 +  .background-app-item .message .message-header .message-close-button:hover,
 +  .message .message-header .background-app-item .message-close-button:hover, .background-app-item .screenshot-ui-show-pointer-button:hover {
 +    background-color: rgba(255, 255, 255, 0.22); }
 +  .background-app-item .icon-button:active, .background-app-item .login-dialog-button.cancel-button:active, .background-app-item .login-dialog-button.switch-user-button:active, .background-app-item .login-dialog-button.login-dialog-session-list-button:active, .background-app-item .calendar .calendar-month-header .pager-button:active, .calendar .calendar-month-header .background-app-item .pager-button:active, .background-app-item .message .message-header .message-expand-button:active, .message .message-header .background-app-item .message-expand-button:active,
 +  .background-app-item .message .message-header .message-close-button:active,
 +  .message .message-header .background-app-item .message-close-button:active, .background-app-item .screenshot-ui-show-pointer-button:active {
 +    background-color: rgba(255, 255, 255, 0.31); }
 +
 +.background-app-item .spinner {
 +  padding: 6px; }
 +
 +.background-app-item.popup-inactive-menu-item {
 +  color: #ffffff; }
 +
 +/* OVERVIEW */
 +.secondary-monitor-workspaces {
 +  spacing: 12px; }
 +
 +#overviewGroup {
-   background-color: rgba(71, 71, 71, 0.98);
-   color: whitesmoke;
++  background-color: #222226; }
 +
 +/* Window Picker */
 +.window-picker {
 +  spacing: 6px; }
 +
 +.window-close, .screenshot-ui-close-button {
-     background-color: rgba(88, 88, 88, 0.98); }
++  background-color: rgba(63, 63, 70, 0.98);
++  color: #fafafb;
 +  border-radius: 999px;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2);
 +  padding: 3px;
 +  height: 32px;
 +  width: 32px;
 +  transition-duration: 100ms;
 +  border: 2px solid transparent; }
 +  .window-close StIcon, .screenshot-ui-close-button StIcon {
 +    icon-size: 24px; }
 +  .window-close:hover, .screenshot-ui-close-button:hover {
-     background-color: rgba(104, 104, 104, 0.98); }
++    background-color: rgba(80, 80, 89, 0.98); }
 +  .window-close:active, .screenshot-ui-close-button:active {
-   background-color: #3d3d3d;
-   color: whitesmoke;
++    background-color: rgba(94, 94, 105, 0.98); }
 +
 +.workspace-background {
 +  border-radius: 30px;
 +  background-color: rgba(3, 2, 1, 0);
 +  box-shadow: 0 4px 16px 4px rgba(0, 0, 0, 0.2); }
 +
 +.search-entry {
 +  border-radius: 999px;
 +  margin-top: 12px;
 +  margin-bottom: 6px;
 +  width: 24em; }
 +  .search-entry .search-entry-icon {
 +    icon-size: 1.091em;
 +    margin-top: 2px;
 +    padding: 0 4px; }
 +
 +/* Search */
 +#searchResults {
 +  margin: 0 4px; }
 +
 +#searchResultsContent {
 +  max-width: 1044px; }
 +
 +.search-section {
 +  spacing: 18px; }
 +  .search-section .search-section-separator {
 +    height: 8px;
 +    background-color: transparent; }
 +
 +.search-section-content {
-   color: whitesmoke;
-   background-color: #3d3d3d;
++  background-color: #38383b;
++  color: #fafafb;
 +  border-radius: 24px;
 +  padding: 12px;
 +  margin: 0 12px;
 +  border: 2px solid transparent; }
 +
 +.list-search-result, .search-provider-icon {
-     color: whitesmoke;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, rgba(61, 61, 61, 0.25), 5%); }
++  color: #fafafb;
++  background-color: #38383b;
++  background-color: transparent;
 +  border-radius: 13.2px; }
 +  .list-search-result:focus, .search-provider-icon:focus {
-       background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 7%), 5%); }
++    color: #fafafb;
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(56, 56, 59, 0.25), 5%); }
 +    .list-search-result:focus:hover, .search-provider-icon:focus:hover {
-     color: whitesmoke;
-     background-color: st-lighten(#3d3d3d, 7%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 7%), 5%); }
 +  .list-search-result:hover, .search-provider-icon:hover {
-     color: whitesmoke;
-     background-color: st-lighten(#3d3d3d, 9%); }
++    color: #fafafb;
++    background-color: st-lighten(#38383b, 7%); }
 +  .list-search-result:active, .search-provider-icon:active {
-       background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); }
++    color: #fafafb;
++    background-color: st-lighten(#38383b, 9%); }
 +    .list-search-result:active:hover, .search-provider-icon:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); }
++      background-color: st-lighten(st-lighten(#38383b, 9%), 7%); }
 +    .list-search-result:active:focus, .search-provider-icon:active:focus {
-     color: whitesmoke;
-     background-color: st-lighten(#3d3d3d, 8%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 9%), 5%); }
 +  .list-search-result:highlighted, .search-provider-icon:highlighted, .list-search-result:selected, .search-provider-icon:selected, .list-search-result:checked, .search-provider-icon:checked {
-       background-color: st-lighten(st-lighten(#3d3d3d, 8%), 7%); }
++    color: #fafafb;
++    background-color: st-lighten(#38383b, 8%); }
 +    .list-search-result:highlighted:hover, .search-provider-icon:highlighted:hover, .list-search-result:selected:hover, .search-provider-icon:selected:hover, .list-search-result:checked:hover, .search-provider-icon:checked:hover {
-       background-color: st-lighten(st-lighten(#3d3d3d, 8%), 9%); }
++      background-color: st-lighten(st-lighten(#38383b, 8%), 7%); }
 +    .list-search-result:highlighted:active, .search-provider-icon:highlighted:active, .list-search-result:selected:active, .search-provider-icon:selected:active, .list-search-result:checked:active, .search-provider-icon:checked:active {
-     color: st-transparentize(whitesmoke, 0.5);
-     background-color: #3d3d3d; }
++      background-color: st-lighten(st-lighten(#38383b, 8%), 9%); }
 +  .list-search-result:insensitive, .search-provider-icon:insensitive {
-   color: rgba(245, 245, 245, 0.8); }
++    color: st-transparentize(#fafafb, 0.5);
++    background-color: #38383b; }
 +  .list-search-result:drop, .search-provider-icon:drop {
 +    background-color: st-transparentize(-st-accent-color, 0.8);
 +    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
 +
 +.search-statustext {
-     color: whitesmoke; }
++  color: rgba(250, 250, 251, 0.8); }
 +
 +.grid-search-results {
 +  spacing: 30px; }
 +
 +.search-provider-icon:ltr {
 +  margin-right: 4px; }
 +
 +.search-provider-icon:rtl {
 +  margin-left: 4px; }
 +
 +.search-provider-icon .list-search-provider-content {
 +  spacing: 12px; }
 +  .search-provider-icon .list-search-provider-content .list-search-provider-details {
 +    width: 120px;
-   color: #959595; }
++    color: #fafafb; }
 +
 +.list-search-results {
 +  spacing: 6px; }
 +
 +.list-search-result .list-search-result-content {
 +  spacing: 6px; }
 +
 +.list-search-result .list-search-result-title {
 +  spacing: 12px; }
 +
 +.list-search-result .list-search-result-description {
-     background-color: #3d3d3d;
++  color: #949497; }
 +
 +/* Dash */
 +#dash {
 +  padding-left: 6px;
 +  padding-right: 6px; }
 +  #dash .dash-background {
-       color: whitesmoke;
-       background-color: #3d3d3d; }
++    background-color: #38383b;
 +    border-radius: 28px;
 +    padding-top: 12px;
 +    padding-bottom: 12px;
 +    padding-left: 10px;
 +    padding-right: 10px; }
 +  #dash .dash-item-container .placeholder {
 +    background-image: none;
 +    background-size: contain;
 +    height: 32px; }
 +  #dash .dash-item-container .empty-dash-drop-target {
 +    width: 32px;
 +    height: 32px; }
 +  #dash .dash-item-container .show-apps,
 +  #dash .dash-item-container .overview-tile,
 +  #dash .dash-item-container .grid-search-result {
 +    margin: 0 2px;
 +    padding-bottom: 12px; }
 +    #dash .dash-item-container .show-apps .overview-icon,
 +    #dash .dash-item-container .overview-tile .overview-icon,
 +    #dash .dash-item-container .grid-search-result .overview-icon {
-       color: whitesmoke;
-       box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-       background-color: st-mix(-st-accent-color, rgba(61, 61, 61, 0.25), 5%); }
++      color: #fafafb;
++      background-color: #38383b; }
 +    #dash .dash-item-container .show-apps:focus .overview-icon,
 +    #dash .dash-item-container .overview-tile:focus .overview-icon,
 +    #dash .dash-item-container .grid-search-result:focus .overview-icon {
-         background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 7%), 5%); }
++      color: #fafafb;
++      box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(56, 56, 59, 0.25), 5%); }
 +      #dash .dash-item-container .show-apps:focus .overview-icon:hover,
 +      #dash .dash-item-container .overview-tile:focus .overview-icon:hover,
 +      #dash .dash-item-container .grid-search-result:focus .overview-icon:hover {
-       color: whitesmoke;
-       background-color: st-lighten(#3d3d3d, 7%); }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 7%), 5%); }
 +    #dash .dash-item-container .show-apps:hover .overview-icon,
 +    #dash .dash-item-container .overview-tile:hover .overview-icon,
 +    #dash .dash-item-container .grid-search-result:hover .overview-icon {
-       color: whitesmoke;
-       background-color: st-lighten(#3d3d3d, 9%); }
++      color: #fafafb;
++      background-color: st-lighten(#38383b, 7%); }
 +    #dash .dash-item-container .show-apps:active .overview-icon,
 +    #dash .dash-item-container .overview-tile:active .overview-icon,
 +    #dash .dash-item-container .grid-search-result:active .overview-icon {
-         background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); }
++      color: #fafafb;
++      background-color: st-lighten(#38383b, 9%); }
 +      #dash .dash-item-container .show-apps:active .overview-icon:hover,
 +      #dash .dash-item-container .overview-tile:active .overview-icon:hover,
 +      #dash .dash-item-container .grid-search-result:active .overview-icon:hover {
-         background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); }
++        background-color: st-lighten(st-lighten(#38383b, 9%), 7%); }
 +      #dash .dash-item-container .show-apps:active .overview-icon:focus,
 +      #dash .dash-item-container .overview-tile:active .overview-icon:focus,
 +      #dash .dash-item-container .grid-search-result:active .overview-icon:focus {
-       color: whitesmoke;
-       background-color: st-lighten(#3d3d3d, 8%); }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 9%), 5%); }
 +    #dash .dash-item-container .show-apps:checked .overview-icon,
 +    #dash .dash-item-container .overview-tile:checked .overview-icon,
 +    #dash .dash-item-container .grid-search-result:checked .overview-icon {
-         background-color: st-lighten(st-lighten(#3d3d3d, 8%), 7%); }
++      color: #fafafb;
++      background-color: st-lighten(#38383b, 8%); }
 +      #dash .dash-item-container .show-apps:checked .overview-icon:hover,
 +      #dash .dash-item-container .overview-tile:checked .overview-icon:hover,
 +      #dash .dash-item-container .grid-search-result:checked .overview-icon:hover {
-         background-color: st-lighten(st-lighten(#3d3d3d, 8%), 9%); }
++        background-color: st-lighten(st-lighten(#38383b, 8%), 7%); }
 +      #dash .dash-item-container .show-apps:checked .overview-icon:active,
 +      #dash .dash-item-container .overview-tile:checked .overview-icon:active,
 +      #dash .dash-item-container .grid-search-result:checked .overview-icon:active {
-     background-color: rgba(245, 245, 245, 0.1); }
++        background-color: st-lighten(st-lighten(#38383b, 8%), 9%); }
 +  #dash .dash-item-container .app-grid-running-dot {
 +    offset-y: -12px; }
 +  #dash .dash-separator {
 +    width: 1px;
 +    margin-left: 4px;
 +    margin-right: 4px;
-   color: whitesmoke;
-   background-color: #282828;
++    background-color: rgba(250, 250, 251, 0.1); }
 +  #dash .dash-separator,
 +  #dash .dash-background {
 +    margin-bottom: 12px; }
 +
 +.dash-label {
 +  -y-offset: 8px; }
 +
 +/* App Grid */
 +.icon-grid {
 +  row-spacing: 12px;
 +  column-spacing: 12px;
 +  max-row-spacing: 36px;
 +  max-column-spacing: 36px;
 +  page-padding-top: 24px;
 +  page-padding-bottom: 24px;
 +  page-padding-left: 18px;
 +  page-padding-right: 18px; }
 +
 +/* App Icons */
 +.overview-tile, .grid-search-result {
-     color: whitesmoke;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.25), 5%); }
++  color: #fafafb;
++  background-color: #222226;
++  background-color: transparent;
 +  border-radius: 24px;
 +  padding: 12px; }
 +  .overview-tile:focus, .grid-search-result:focus {
-       background-color: st-mix(-st-accent-color, st-lighten(#282828, 7%), 5%); }
++    color: #fafafb;
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(34, 34, 38, 0.25), 5%); }
 +    .overview-tile:focus:hover, .grid-search-result:focus:hover {
-     color: whitesmoke;
-     background-color: st-lighten(#282828, 7%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#222226, 7%), 5%); }
 +  .overview-tile:hover, .grid-search-result:hover {
-     color: whitesmoke;
-     background-color: st-lighten(#282828, 9%); }
++    color: #fafafb;
++    background-color: st-lighten(#222226, 7%); }
 +  .overview-tile:active, .grid-search-result:active {
-       background-color: st-lighten(st-lighten(#282828, 9%), 7%); }
++    color: #fafafb;
++    background-color: st-lighten(#222226, 9%); }
 +    .overview-tile:active:hover, .grid-search-result:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(#282828, 9%), 5%); }
++      background-color: st-lighten(st-lighten(#222226, 9%), 7%); }
 +    .overview-tile:active:focus, .grid-search-result:active:focus {
-     color: whitesmoke;
-     background-color: st-lighten(#282828, 8%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#222226, 9%), 5%); }
 +  .overview-tile:highlighted, .grid-search-result:highlighted, .overview-tile:selected, .grid-search-result:selected, .overview-tile:checked, .grid-search-result:checked {
-       background-color: st-lighten(st-lighten(#282828, 8%), 7%); }
++    color: #fafafb;
++    background-color: st-lighten(#222226, 8%); }
 +    .overview-tile:highlighted:hover, .grid-search-result:highlighted:hover, .overview-tile:selected:hover, .grid-search-result:selected:hover, .overview-tile:checked:hover, .grid-search-result:checked:hover {
-       background-color: st-lighten(st-lighten(#282828, 8%), 9%); }
++      background-color: st-lighten(st-lighten(#222226, 8%), 7%); }
 +    .overview-tile:highlighted:active, .grid-search-result:highlighted:active, .overview-tile:selected:active, .grid-search-result:selected:active, .overview-tile:checked:active, .grid-search-result:checked:active {
-     color: st-transparentize(whitesmoke, 0.5);
-     background-color: #282828; }
++      background-color: st-lighten(st-lighten(#222226, 8%), 9%); }
 +  .overview-tile:insensitive, .grid-search-result:insensitive {
-   color: whitesmoke;
-   background-color: st-mix(whitesmoke, #282828, 9%); }
++    color: st-transparentize(#fafafb, 0.5);
++    background-color: #222226; }
 +  .overview-tile:drop, .grid-search-result:drop {
 +    background-color: st-transparentize(-st-accent-color, 0.8);
 +    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
 +  .overview-tile .overview-icon.overview-icon-with-label > StBoxLayout, .grid-search-result .overview-icon.overview-icon-with-label > StBoxLayout {
 +    spacing: 6px; }
 +
 +.app-folder {
-     color: whitesmoke;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, st-mix(whitesmoke, #282828, 9%), 5%); }
++  color: #fafafb;
++  background-color: st-mix(#fafafb, #222226, 9%); }
 +  .app-folder:focus {
-       background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 9%), 4%), 5%); }
++    color: #fafafb;
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#fafafb, #222226, 9%), 5%); }
 +    .app-folder:focus:hover {
-     color: whitesmoke;
-     background-color: st-lighten(st-mix(whitesmoke, #282828, 9%), 4%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #222226, 9%), 4%), 5%); }
 +  .app-folder:hover {
-     color: whitesmoke;
-     background-color: st-lighten(st-mix(whitesmoke, #282828, 9%), 9%); }
++    color: #fafafb;
++    background-color: st-lighten(st-mix(#fafafb, #222226, 9%), 4%); }
 +  .app-folder:active {
-       background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 9%), 9%), 4%); }
++    color: #fafafb;
++    background-color: st-lighten(st-mix(#fafafb, #222226, 9%), 9%); }
 +    .app-folder:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 9%), 9%), 5%); }
++      background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 9%), 9%), 4%); }
 +    .app-folder:active:focus {
-     color: whitesmoke;
-     background-color: st-lighten(st-mix(whitesmoke, #282828, 9%), 8%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #222226, 9%), 9%), 5%); }
 +  .app-folder:highlighted, .app-folder:selected, .app-folder:checked {
-       background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 9%), 8%), 4%); }
++    color: #fafafb;
++    background-color: st-lighten(st-mix(#fafafb, #222226, 9%), 8%); }
 +    .app-folder:highlighted:hover, .app-folder:selected:hover, .app-folder:checked:hover {
-       background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 9%), 8%), 9%); }
++      background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 9%), 8%), 4%); }
 +    .app-folder:highlighted:active, .app-folder:selected:active, .app-folder:checked:active {
-     color: st-transparentize(whitesmoke, 0.5);
-     background-color: st-darken(st-mix(whitesmoke, #282828, 9%), 3%); }
++      background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 9%), 8%), 9%); }
 +  .app-folder:insensitive {
-   background-color: whitesmoke;
++    color: st-transparentize(#fafafb, 0.5);
++    background-color: st-darken(st-mix(#fafafb, #222226, 9%), 3%); }
 +  .app-folder:drop {
 +    background-color: st-transparentize(-st-accent-color, 0.8);
 +    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
 +
 +.app-grid-running-dot {
 +  height: 5px;
 +  width: 5px;
 +  border-radius: 5px;
-   background-color: #3d3d3d;
-   color: whitesmoke;
++  background-color: #fafafb;
 +  offset-y: 6px; }
 +
 +.app-folder-dialog-container {
 +  padding-top: 2.2em; }
 +
 +.app-folder-dialog {
 +  width: 720px;
 +  height: 720px;
 +  border-radius: 64px;
-   box-shadow: inset 0 0 0 1px rgba(245, 245, 245, 0.1); }
++  background-color: #38383b;
++  color: #fafafb;
 +  padding: 0 1px;
-     color: whitesmoke;
-     background-color: st-mix(whitesmoke, #3d3d3d, 9%); }
++  box-shadow: inset 0 0 0 1px rgba(250, 250, 251, 0.1); }
 +  .app-folder-dialog .folder-name-container {
 +    padding: 24px 36px;
 +    padding-bottom: 0; }
 +    .app-folder-dialog .folder-name-container .folder-name-entry {
 +      width: 12em; }
 +  .app-folder-dialog .icon-button, .app-folder-dialog .login-dialog-button.cancel-button, .app-folder-dialog .login-dialog-button.switch-user-button, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button, .app-folder-dialog .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .app-folder-dialog .pager-button, .app-folder-dialog .message .message-header .message-expand-button, .message .message-header .app-folder-dialog .message-expand-button,
 +  .app-folder-dialog .message .message-header .message-close-button,
 +  .message .message-header .app-folder-dialog .message-close-button, .app-folder-dialog .screenshot-ui-show-pointer-button {
-       color: whitesmoke;
-       background-color: st-lighten(st-mix(whitesmoke, #3d3d3d, 9%), 4%); }
++    color: #fafafb;
++    background-color: st-mix(#fafafb, #38383b, 9%); }
 +    .app-folder-dialog .icon-button:hover, .app-folder-dialog .login-dialog-button.cancel-button:hover, .app-folder-dialog .login-dialog-button.switch-user-button:hover, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:hover, .app-folder-dialog .calendar .calendar-month-header .pager-button:hover, .calendar .calendar-month-header .app-folder-dialog .pager-button:hover, .app-folder-dialog .message .message-header .message-expand-button:hover, .message .message-header .app-folder-dialog .message-expand-button:hover,
 +    .app-folder-dialog .message .message-header .message-close-button:hover,
 +    .message .message-header .app-folder-dialog .message-close-button:hover, .app-folder-dialog .screenshot-ui-show-pointer-button:hover {
-       color: whitesmoke;
-       background-color: st-lighten(st-mix(whitesmoke, #3d3d3d, 9%), 9%); }
++      color: #fafafb;
++      background-color: st-lighten(st-mix(#fafafb, #38383b, 9%), 4%); }
 +    .app-folder-dialog .icon-button:active, .app-folder-dialog .login-dialog-button.cancel-button:active, .app-folder-dialog .login-dialog-button.switch-user-button:active, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active, .app-folder-dialog .calendar .calendar-month-header .pager-button:active, .calendar .calendar-month-header .app-folder-dialog .pager-button:active, .app-folder-dialog .message .message-header .message-expand-button:active, .message .message-header .app-folder-dialog .message-expand-button:active,
 +    .app-folder-dialog .message .message-header .message-close-button:active,
 +    .message .message-header .app-folder-dialog .message-close-button:active, .app-folder-dialog .screenshot-ui-show-pointer-button:active {
-         background-color: st-lighten(st-lighten(st-mix(whitesmoke, #3d3d3d, 9%), 9%), 4%); }
++      color: #fafafb;
++      background-color: st-lighten(st-mix(#fafafb, #38383b, 9%), 9%); }
 +      .app-folder-dialog .icon-button:active:hover, .app-folder-dialog .login-dialog-button.cancel-button:active:hover, .app-folder-dialog .login-dialog-button.switch-user-button:active:hover, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active:hover, .app-folder-dialog .calendar .calendar-month-header .pager-button:active:hover, .calendar .calendar-month-header .app-folder-dialog .pager-button:active:hover, .app-folder-dialog .message .message-header .message-expand-button:active:hover, .message .message-header .app-folder-dialog .message-expand-button:active:hover,
 +      .app-folder-dialog .message .message-header .message-close-button:active:hover,
 +      .message .message-header .app-folder-dialog .message-close-button:active:hover, .app-folder-dialog .screenshot-ui-show-pointer-button:active:hover {
-         background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #3d3d3d, 9%), 9%), 5%); }
++        background-color: st-lighten(st-lighten(st-mix(#fafafb, #38383b, 9%), 9%), 4%); }
 +      .app-folder-dialog .icon-button:active:focus, .app-folder-dialog .login-dialog-button.cancel-button:active:focus, .app-folder-dialog .login-dialog-button.switch-user-button:active:focus, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active:focus, .app-folder-dialog .calendar .calendar-month-header .pager-button:active:focus, .calendar .calendar-month-header .app-folder-dialog .pager-button:active:focus, .app-folder-dialog .message .message-header .message-expand-button:active:focus, .message .message-header .app-folder-dialog .message-expand-button:active:focus,
 +      .app-folder-dialog .message .message-header .message-close-button:active:focus,
 +      .message .message-header .app-folder-dialog .message-close-button:active:focus, .app-folder-dialog .screenshot-ui-show-pointer-button:active:focus {
-     color: whitesmoke;
-     background-color: #3d3d3d; }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #38383b, 9%), 9%), 5%); }
 +  .app-folder-dialog .page-indicators {
 +    margin-bottom: 24px; }
 +  .app-folder-dialog .page-navigation-arrow {
-       color: whitesmoke;
-       background-color: st-lighten(#3d3d3d, 7%); }
++    color: #fafafb;
++    background-color: #38383b; }
 +    .app-folder-dialog .page-navigation-arrow:hover {
-       color: whitesmoke;
-       background-color: st-lighten(#3d3d3d, 9%); }
++      color: #fafafb;
++      background-color: st-lighten(#38383b, 7%); }
 +    .app-folder-dialog .page-navigation-arrow:active {
-         background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); }
++      color: #fafafb;
++      background-color: st-lighten(#38383b, 9%); }
 +      .app-folder-dialog .page-navigation-arrow:active:hover {
-         background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); }
++        background-color: st-lighten(st-lighten(#38383b, 9%), 7%); }
 +      .app-folder-dialog .page-navigation-arrow:active:focus {
-     color: whitesmoke;
-     background-color: #3d3d3d; }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 9%), 5%); }
 +  .app-folder-dialog .overview-tile, .app-folder-dialog .grid-search-result {
-       color: whitesmoke;
-       box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-       background-color: st-mix(-st-accent-color, rgba(61, 61, 61, 0.25), 5%); }
++    color: #fafafb;
++    background-color: #38383b;
++    background-color: transparent; }
 +    .app-folder-dialog .overview-tile:focus, .app-folder-dialog .grid-search-result:focus {
-         background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 7%), 5%); }
++      color: #fafafb;
++      box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(56, 56, 59, 0.25), 5%); }
 +      .app-folder-dialog .overview-tile:focus:hover, .app-folder-dialog .grid-search-result:focus:hover {
-       color: whitesmoke;
-       background-color: st-lighten(#3d3d3d, 7%); }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 7%), 5%); }
 +    .app-folder-dialog .overview-tile:hover, .app-folder-dialog .grid-search-result:hover {
-       color: whitesmoke;
-       background-color: st-lighten(#3d3d3d, 9%); }
++      color: #fafafb;
++      background-color: st-lighten(#38383b, 7%); }
 +    .app-folder-dialog .overview-tile:active, .app-folder-dialog .grid-search-result:active {
-         background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); }
++      color: #fafafb;
++      background-color: st-lighten(#38383b, 9%); }
 +      .app-folder-dialog .overview-tile:active:hover, .app-folder-dialog .grid-search-result:active:hover {
-         background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); }
++        background-color: st-lighten(st-lighten(#38383b, 9%), 7%); }
 +      .app-folder-dialog .overview-tile:active:focus, .app-folder-dialog .grid-search-result:active:focus {
-       color: whitesmoke;
-       background-color: st-lighten(#3d3d3d, 8%); }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 9%), 5%); }
 +    .app-folder-dialog .overview-tile:highlighted, .app-folder-dialog .grid-search-result:highlighted, .app-folder-dialog .overview-tile:selected, .app-folder-dialog .grid-search-result:selected, .app-folder-dialog .overview-tile:checked, .app-folder-dialog .grid-search-result:checked {
-         background-color: st-lighten(st-lighten(#3d3d3d, 8%), 7%); }
++      color: #fafafb;
++      background-color: st-lighten(#38383b, 8%); }
 +      .app-folder-dialog .overview-tile:highlighted:hover, .app-folder-dialog .grid-search-result:highlighted:hover, .app-folder-dialog .overview-tile:selected:hover, .app-folder-dialog .grid-search-result:selected:hover, .app-folder-dialog .overview-tile:checked:hover, .app-folder-dialog .grid-search-result:checked:hover {
-         background-color: st-lighten(st-lighten(#3d3d3d, 8%), 9%); }
++        background-color: st-lighten(st-lighten(#38383b, 8%), 7%); }
 +      .app-folder-dialog .overview-tile:highlighted:active, .app-folder-dialog .grid-search-result:highlighted:active, .app-folder-dialog .overview-tile:selected:active, .app-folder-dialog .grid-search-result:selected:active, .app-folder-dialog .overview-tile:checked:active, .app-folder-dialog .grid-search-result:checked:active {
-       color: st-transparentize(whitesmoke, 0.5);
-       background-color: #3d3d3d; }
++        background-color: st-lighten(st-lighten(#38383b, 8%), 9%); }
 +    .app-folder-dialog .overview-tile:insensitive, .app-folder-dialog .grid-search-result:insensitive {
-     background-color: whitesmoke;
++      color: st-transparentize(#fafafb, 0.5);
++      background-color: #38383b; }
 +    .app-folder-dialog .overview-tile:drop, .app-folder-dialog .grid-search-result:drop {
 +      background-color: st-transparentize(-st-accent-color, 0.8);
 +      box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
 +
 +.rename-folder-popup .rename-folder-popup-item {
 +  spacing: 6px; }
 +  .rename-folder-popup .rename-folder-popup-item:ltr, .rename-folder-popup .rename-folder-popup-item:rtl {
 +    padding: 0 12px; }
 +
 +.page-indicator {
 +  padding: 6px 12px 0;
 +  transition-duration: 400ms; }
 +  .page-indicator .page-indicator-icon {
 +    width: 10px;
 +    height: 10px;
 +    border-radius: 999px;
-   background-color: rgba(245, 245, 245, 0.1);
-   color: whitesmoke;
++    background-color: #fafafb;
 +    transition-duration: 400ms; }
 +
 +.apps-scroll-view {
 +  padding: 0; }
 +
 +.system-action-icon {
-   color: whitesmoke;
-   background-color: #282828; }
++  background-color: rgba(250, 250, 251, 0.1);
++  color: #fafafb;
 +  border-radius: 999px;
 +  icon-size: 48px; }
 +
 +.page-navigation-hint.dnd {
 +  background: rgba(255, 255, 255, 0.1); }
 +
 +.page-navigation-hint.next:ltr, .page-navigation-hint.previous:rtl {
 +  background-gradient-start: rgba(255, 255, 255, 0.05);
 +  background-gradient-end: transparent;
 +  background-gradient-direction: horizontal;
 +  border-radius: 24px 0px 0px 24px; }
 +
 +.page-navigation-hint.previous:ltr, .page-navigation-hint.next:rtl {
 +  background-gradient-start: transparent;
 +  background-gradient-end: rgba(255, 255, 255, 0.05);
 +  background-gradient-direction: horizontal;
 +  border-radius: 0px 24px 24px 0px; }
 +
 +.page-navigation-arrow {
 +  margin: 6px;
 +  padding: 18px;
 +  width: 24px;
 +  height: 24px;
 +  border-radius: 999px;
 +  transition-duration: 100ms;
-     color: whitesmoke; }
++  color: #fafafb;
++  background-color: #222226; }
 +  .page-navigation-arrow > StIcon {
-     color: whitesmoke;
-     background-color: st-lighten(#282828, 7%); }
++    color: #fafafb; }
 +  .page-navigation-arrow:hover {
-     color: whitesmoke;
-     background-color: st-lighten(#282828, 9%); }
++    color: #fafafb;
++    background-color: st-lighten(#222226, 7%); }
 +  .page-navigation-arrow:active {
-       background-color: st-lighten(st-lighten(#282828, 9%), 7%); }
++    color: #fafafb;
++    background-color: st-lighten(#222226, 9%); }
 +    .page-navigation-arrow:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(#282828, 9%), 5%); }
++      background-color: st-lighten(st-lighten(#222226, 9%), 7%); }
 +    .page-navigation-arrow:active:focus {
-     color: whitesmoke;
-     background-color: #4e4e4e;
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#222226, 9%), 5%); }
 +
 +/* Workspace pager */
 +.workspace-thumbnails {
 +  visible-width: 32px;
 +  spacing: 6px;
 +  padding: 6px; }
 +  .workspace-thumbnails .workspace-thumbnail {
-   color: #f6d32d; }
++    color: #fafafb;
++    background-color: #46464e;
 +    border-radius: 4px;
 +    border: 1px solid transparent; }
 +  .workspace-thumbnails .placeholder {
 +    background-image: url("resource:///org/gnome/shell/theme/workspace-placeholder.svg");
 +    background-size: contain;
 +    width: 18px; }
 +
 +.workspace-thumbnail-indicator {
 +  border: 3px solid -st-accent-color;
 +  border-radius: 8px; }
 +
 +.ripple-pointer-location {
 +  width: 50px;
 +  height: 50px;
 +  border-radius: 25px;
 +  background-color: st-lighten(st-transparentize(-st-accent-color, 0.7), 30%);
 +  box-shadow: 0 0 2px 2px st-lighten(-st-accent-color, 20%); }
 +
 +.pie-timer {
 +  width: 60px;
 +  height: 60px;
 +  -pie-border-width: 3px;
 +  -pie-border-color: -st-accent-color;
 +  -pie-background-color: st-lighten(st-transparentize(-st-accent-color, 0.7), 40%); }
 +
 +.magnifier-zoom-region {
 +  border: 2px solid -st-accent-color; }
 +  .magnifier-zoom-region.full-screen {
 +    border-width: 0; }
 +
 +.select-area-rubberband {
 +  background-color: st-transparentize(-st-accent-color, 0.7);
 +  border: 1px solid -st-accent-color; }
 +
 +.user-icon {
 +  background-size: contain;
 +  border-radius: 999px;
 +  icon-size: 64px;
 +  background-color: rgba(255, 255, 255, 0.05);
 +  color: #ffffff; }
 +  .user-icon StIcon {
 +    padding: 12px; }
 +  .user-icon.user-avatar {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1); }
 +
 +.lightbox {
 +  background-color: black; }
 +
 +.flashspot {
 +  background-color: white; }
 +
 +.hidden {
 +  color: transparent; }
 +
 +.caps-lock-warning-label {
 +  text-align: center;
 +  padding-bottom: 8px;
-   background-color: #353535; }
++  color: #cd9309; }
 +
 +/* Workspace animation */
 +.workspace-animation {
-   background-color: #353535;
++  background-color: #2e2e33; }
 +
 +/* Tiled window previews */
 +.tile-preview {
 +  background-color: st-transparentize(-st-accent-color, 0.5);
 +  border: 1px solid -st-accent-color; }
 +
 +/* On-screen Keyboard */
 +#keyboard {
-   min-height: 1.2em;
-   min-width: 1.2em;
-   border-width: 1px;
-   border-style: solid;
-   border-radius: 10px;
++  background-color: #2e2e33;
 +  box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.02); }
 +  #keyboard .page-indicator {
 +    padding: 6px; }
 +    #keyboard .page-indicator .page-indicator-icon {
 +      width: 8px;
 +      height: 8px; }
 +
 +.key-container {
 +  padding: 4px;
 +  spacing: 4px; }
 +
 +.keyboard-key {
 +  font-size: 1.455em;
 +  font-weight: bold;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 9%), 5%); }
++  border-radius: 0.546em;
 +  box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.2);
 +  color: #ffffff;
 +  background-color: st-mix(#ffffff, #4d4d4d, 9%); }
 +  .keyboard-key:focus {
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 4%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#ffffff, #36363a, 9%), 5%); }
 +    .keyboard-key:focus:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #36363a, 9%), 4%), 5%); }
 +  .keyboard-key:hover {
 +    color: #ffffff;
 +    background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 4%); }
 +  .keyboard-key:active {
 +    color: #ffffff;
 +    background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%); }
 +    .keyboard-key:active:hover {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 4%); }
 +    .keyboard-key:active:focus {
-   .keyboard-key:grayed {
-     background-color: #2d2d2d;
-     color: #ffffff;
-     border-color: rgba(255, 255, 255, 0.1); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 5%); }
 +  .keyboard-key:checked {
 +    color: #ffffff;
 +    background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%); }
 +    .keyboard-key:checked:hover {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 4%); }
 +    .keyboard-key:checked:active {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 9%); }
-     border-radius: 10px; }
 +  .keyboard-key.default-key {
 +    color: #ffffff;
 +    background-color: st-mix(#ffffff, #333333, 9%);
-         background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #333333, 9%), 9%), 5%); }
++    border: none; }
 +    .keyboard-key.default-key:hover {
 +      color: #ffffff;
 +      background-color: st-lighten(st-mix(#ffffff, #333333, 9%), 4%); }
 +    .keyboard-key.default-key:active {
 +      color: #ffffff;
 +      background-color: st-lighten(st-mix(#ffffff, #333333, 9%), 9%); }
 +      .keyboard-key.default-key:active:hover {
 +        background-color: st-lighten(st-lighten(st-mix(#ffffff, #333333, 9%), 9%), 4%); }
 +      .keyboard-key.default-key:active:focus {
-       border-color: st-lighten(-st-accent-color, 5%);
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #333333, 9%), 9%), 5%); }
 +    .keyboard-key.default-key:checked {
 +      color: #ffffff;
 +      background-color: st-lighten(st-mix(#ffffff, #333333, 9%), 8%); }
 +      .keyboard-key.default-key:checked:hover {
 +        background-color: st-lighten(st-lighten(st-mix(#ffffff, #333333, 9%), 8%), 4%); }
 +      .keyboard-key.default-key:checked:active {
 +        background-color: st-lighten(st-lighten(st-mix(#ffffff, #333333, 9%), 8%), 9%); }
 +    .keyboard-key.default-key:latched {
-   .keyboard-key.enter-key {
-     color: -st-accent-fg-color;
-     background-color: st-mix(-st-accent-fg-color, -st-accent-color, 9%);
-     border-radius: 10px;
-     color: #ffffff; }
-     .keyboard-key.enter-key:hover {
-       color: -st-accent-fg-color;
-       background-color: st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 4%); }
-     .keyboard-key.enter-key:active {
-       color: -st-accent-fg-color;
-       background-color: st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 9%); }
-       .keyboard-key.enter-key:active:hover {
-         background-color: st-lighten(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 9%), 4%); }
-       .keyboard-key.enter-key:active:focus {
-         background-color: st-mix(-st-accent-color, st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 9%), 5%); }
-     .keyboard-key.enter-key:checked {
-       color: -st-accent-fg-color;
-       background-color: st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 8%); }
-       .keyboard-key.enter-key:checked:hover {
-         background-color: st-lighten(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 8%), 4%); }
-       .keyboard-key.enter-key:checked:active {
-         background-color: st-lighten(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 8%), 9%); }
-   .keyboard-key.shift-key-uppercase {
-     background-color: gray;
-     color: #353535; }
-     .keyboard-key.shift-key-uppercase:hover {
-       background-color: #8c8c8c;
-       color: #424242; }
 +      background-color: -st-accent-color; }
-     icon-size: 24px; }
 +  .keyboard-key StIcon {
- .keyboard-subkeys {
-   -arrow-border-radius: 16px;
-   -arrow-background-color: #353535;
++    icon-size: 1.6365em; }
 +
-   -arrow-border-color: #4c4c4c;
++.keyboard-subkeys-boxpointer {
++  -arrow-border-radius: 22px;
++  -arrow-background-color: #2e2e33;
 +  -arrow-border-width: 1px;
-   -boxpointer-gap: 6px;
-   padding: 6px; }
-   .keyboard-subkeys .keyboard-key {
-     color: #ffffff;
-     background-color: st-mix(#ffffff, #4d4d4d, 9%);
-     border-radius: 10px; }
-     .keyboard-subkeys .keyboard-key:focus {
-       color: #ffffff;
-       box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-       background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 9%), 5%); }
-       .keyboard-subkeys .keyboard-key:focus:hover {
-         background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 4%), 5%); }
-     .keyboard-subkeys .keyboard-key:hover {
-       color: #ffffff;
-       background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 4%); }
-     .keyboard-subkeys .keyboard-key:active {
-       color: #ffffff;
-       background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%); }
-       .keyboard-subkeys .keyboard-key:active:hover {
-         background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 4%); }
-       .keyboard-subkeys .keyboard-key:active:focus {
-         background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 5%); }
-     .keyboard-subkeys .keyboard-key:checked {
-       color: #ffffff;
-       background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%); }
-       .keyboard-subkeys .keyboard-key:checked:hover {
-         background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 4%); }
-       .keyboard-subkeys .keyboard-key:checked:active {
-         background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 9%); }
++  -arrow-border-color: #44444c;
 +  -arrow-base: 20px;
 +  -arrow-rise: 10px;
-     padding: 0px 18px;
++  -boxpointer-gap: 4px;
++  border-radius: 22px;
++  box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.1); }
++  .keyboard-subkeys-boxpointer .key-container {
++    padding: 12px;
++    spacing: 8px; }
 +
 +.emoji-page .keyboard-key {
 +  background-color: transparent;
 +  border: none;
 +  color: initial; }
 +
 +.emoji-panel .keyboard-key:latched {
 +  border-color: st-lighten(-st-accent-color, 5%);
 +  background-color: -st-accent-color; }
 +
 +.word-suggestions {
 +  spacing: 12px;
 +  min-height: 17pt;
 +  padding: 12px;
 +  color: #ffffff; }
 +  .word-suggestions StButton {
 +    margin: 0 3px;
 +    min-width: 32px;
 +    border-radius: 4px;
-       box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-       background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 9%), 5%); }
++    padding: 6px 18px;
 +    background-color: transparent;
 +    border-color: transparent;
 +    box-shadow: none; }
 +    .word-suggestions StButton:insensitive {
 +      background-color: transparent !important; }
 +    .word-suggestions StButton:focus {
 +      color: #ffffff;
-         background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 4%), 5%); }
++      box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#ffffff, #36363a, 9%), 5%); }
 +      .word-suggestions StButton:focus:hover {
-         background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 5%); }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #36363a, 9%), 4%), 5%); }
 +    .word-suggestions StButton:hover {
 +      color: #ffffff;
 +      background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 4%); }
 +    .word-suggestions StButton:active {
 +      color: #ffffff;
 +      background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%); }
 +      .word-suggestions StButton:active:hover {
 +        background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 4%); }
 +      .word-suggestions StButton:active:focus {
-   background-color: rgba(53, 53, 53, 0.98);
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 5%); }
 +    .word-suggestions StButton:checked {
 +      color: #ffffff;
 +      background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%); }
 +      .word-suggestions StButton:checked:hover {
 +        background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 4%); }
 +      .word-suggestions StButton:checked:active {
 +        background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 9%); }
 +
 +/* Looking Glass */
 +.lg-dialog StEntry {
 +  min-height: 1.5em; }
 +
 +.lg-dialog .shell-link {
 +  color: st-lighten(-st-accent-color, 20%); }
 +  .lg-dialog .shell-link:hover {
 +    color: st-lighten(st-lighten(-st-accent-color, 20%), 10%); }
 +  .lg-dialog .shell-link:active {
 +    color: st-darken(st-lighten(-st-accent-color, 20%), 10%); }
 +
 +.lg-dialog .actor-link {
 +  color: st-darken(#ffffff, 20%); }
 +  .lg-dialog .actor-link:hover {
 +    color: #ffffff; }
 +  .lg-dialog .actor-link:active {
 +    color: st-lighten(#ffffff, 20%); }
 +  .lg-dialog .actor-link StIcon {
 +    icon-size: 12px; }
 +
 +.lg-completions-text {
 +  font-style: italic; }
 +
 +#LookingGlassDialog {
-       background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 9%); }
++  background-color: rgba(46, 46, 51, 0.98);
 +  color: #ffffff;
 +  border-radius: 16px;
 +  margin-top: 4px;
 +  border: 2px solid transparent;
 +  padding: 6px;
 +  spacing: 6px;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2); }
 +  #LookingGlassDialog > #Toolbar {
 +    border: none;
 +    padding: 6px;
 +    border-radius: 0;
 +    background-color: transparent;
 +    spacing: 6px; }
 +    #LookingGlassDialog > #Toolbar .lg-toolbar-button {
 +      padding: 6px 12px; }
 +      #LookingGlassDialog > #Toolbar .lg-toolbar-button > StIcon {
 +        icon-size: 16px; }
 +  #LookingGlassDialog .labels {
 +    spacing: 6px; }
 +  #LookingGlassDialog .notebook-tab {
 +    background-color: transparent;
 +    -natural-hpadding: 12px;
 +    -minimum-hpadding: 12px;
 +    padding: 6px 12px; }
 +    #LookingGlassDialog .notebook-tab:selected {
 +      color: #ffffff;
-         background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 9%), 4%); }
++      background-color: st-lighten(st-mix(#ffffff, #2e2e33, 9%), 9%); }
 +      #LookingGlassDialog .notebook-tab:selected:hover {
-         background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 9%), 5%); }
++        background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 9%), 9%), 4%); }
 +      #LookingGlassDialog .notebook-tab:selected:focus {
-   background-color: #353535;
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #2e2e33, 9%), 9%), 5%); }
 +
 +#LookingGlassPropertyInspector {
-     background-color: st-mix(#ffffff, #353535, 9%);
++  background-color: #2e2e33;
 +  color: #ffffff;
 +  border-radius: 16px;
 +  border: 1px solid rgba(255, 255, 255, 0.1);
 +  padding: 12px; }
 +  #LookingGlassPropertyInspector .lg-obj-inspector-title {
 +    spacing: 4px; }
 +  #LookingGlassPropertyInspector .lg-obj-inspector-close-button,
 +  #LookingGlassPropertyInspector .lg-obj-inspector-button {
 +    padding: 6px 12px; }
 +  #LookingGlassPropertyInspector .lg-obj-inspector-close-button {
 +    margin: 4px;
 +    padding: 6px;
 +    border-radius: 999px; }
 +    #LookingGlassPropertyInspector .lg-obj-inspector-close-button > StIcon {
 +      icon-size: 16px; }
 +
 +#LookingGlassEvaluator {
 +  padding: 6px; }
 +  #LookingGlassEvaluator .evaluator-results {
 +    spacing: 6px; }
 +
 +#LookingGlassWindows {
 +  padding: 6px;
 +  spacing: 6px; }
 +  #LookingGlassWindows .lg-window {
 +    color: #ffffff;
-   background-color: st-mix(#ffffff, #353535, 9%);
++    background-color: st-mix(#ffffff, #2e2e33, 9%);
 +    margin: 0;
 +    padding: 12px; }
 +
 +#LookingGlassExtensions .lg-extensions-list {
 +  padding: 6px;
 +  spacing: 6px; }
 +
 +#LookingGlassExtensions .lg-extension {
 +  color: #ffffff;
-   color: whitesmoke; }
++  background-color: st-mix(#ffffff, #2e2e33, 9%);
 +  margin: 0;
 +  spacing: 4px;
 +  padding: 12px; }
 +  #LookingGlassExtensions .lg-extension .lg-extension-name {
 +    color: #ffffff !important; }
 +  #LookingGlassExtensions .lg-extension .lg-extension-meta {
 +    spacing: 12px; }
 +
 +#LookingGlassExtensions .lg-extensions-none {
 +  color: rgba(255, 255, 255, 0.5); }
 +
 +#LookingGlassActors {
 +  padding: 6px;
 +  spacing: 4px; }
 +
 +#LookingGlassDebugFlags .lg-debug-flags-header {
 +  padding: 6px;
 +  padding-top: 12px; }
 +
 +#LookingGlassDebugFlags .lg-debug-flag-button {
 +  padding: 9px 12px;
 +  margin-bottom: 6px; }
 +  #LookingGlassDebugFlags .lg-debug-flag-button StLabel {
 +    font-weight: normal !important; }
 +  #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch {
 +    background: rgba(255, 255, 255, 0.15); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:hover {
 +      background: rgba(255, 255, 255, 0.2); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:checked {
 +      background: -st-accent-color;
 +      color: -st-accent-fg-color; }
 +      #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:checked:hover {
 +        background-color: st-lighten(-st-accent-color, 5%);
 +        color: st-lighten(-st-accent-fg-color, 5%); }
 +
 +.login-dialog,
 +.unlock-dialog {
-     color: whitesmoke; }
++  color: #fafafb; }
 +  .login-dialog .caps-lock-warning-label,
 +  .login-dialog .login-dialog-message-warning,
 +  .unlock-dialog .caps-lock-warning-label,
 +  .unlock-dialog .login-dialog-message-warning {
-     color: #f6d32d; }
++    color: #fafafb; }
 +  .login-dialog .login-dialog-prompt-layout,
 +  .unlock-dialog .login-dialog-prompt-layout {
 +    width: 25em;
 +    spacing: 9px; }
 +
 +.login-dialog-button.cancel-button {
 +  padding: 9px; }
 +
 +.login-dialog-button-box {
 +  spacing: 12px; }
 +
 +.conflicting-session-dialog-content {
 +  spacing: 20px; }
 +  .conflicting-session-dialog-content .conflicting-session-dialog-title {
 +    text-align: center;
 +    margin-bottom: 5px; }
 +  .conflicting-session-dialog-content .conflicting-session-dialog-desc {
 +    text-align: center; }
 +  .conflicting-session-dialog-content .conflicting-session-dialog-desc-warning {
 +    text-align: center;
-     color: gainsboro; }
++    color: #cd9309; }
 +
 +.login-dialog-logo-bin {
 +  margin: 3em 0; }
 +
 +.login-dialog-banner-view {
 +  max-width: 25em; }
 +  .login-dialog-banner-view .login-dialog-banner {
-   color: gainsboro;
++    color: #dedee4; }
 +
 +.login-dialog-message {
 +  text-align: center; }
 +
 +.login-dialog-message-hint, .login-dialog-message {
-   color: whitesmoke;
-   background-color: #282828;
++  color: #dedee4;
 +  min-height: 2.75em; }
 +
 +.login-dialog-user-selection-box {
 +  padding-top: 4em;
 +  padding-bottom: 8em; }
 +
 +.login-dialog-not-listed-label {
 +  padding: 6px; }
 +
 +.login-dialog-not-listed-button {
-     color: whitesmoke;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.25), 5%); }
++  color: #fafafb;
++  background-color: #222226;
 +  padding: 0 6px;
 +  margin: 6px; }
 +  .login-dialog-not-listed-button:focus {
-       background-color: st-mix(-st-accent-color, st-lighten(#282828, 7%), 5%); }
++    color: #fafafb;
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(34, 34, 38, 0.25), 5%); }
 +    .login-dialog-not-listed-button:focus:hover {
-     color: whitesmoke;
-     background-color: st-lighten(#282828, 7%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#222226, 7%), 5%); }
 +  .login-dialog-not-listed-button:hover {
-     color: whitesmoke;
-     background-color: st-lighten(#282828, 9%); }
++    color: #fafafb;
++    background-color: st-lighten(#222226, 7%); }
 +  .login-dialog-not-listed-button:active {
-       background-color: st-lighten(st-lighten(#282828, 9%), 7%); }
++    color: #fafafb;
++    background-color: st-lighten(#222226, 9%); }
 +    .login-dialog-not-listed-button:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(#282828, 9%), 5%); }
++      background-color: st-lighten(st-lighten(#222226, 9%), 7%); }
 +    .login-dialog-not-listed-button:active:focus {
-   color: darkgray; }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#222226, 9%), 5%); }
 +
 +.login-dialog-auth-list-view {
 +  -st-vfade-offset: 3em; }
 +
 +.login-dialog-auth-list {
 +  spacing: 6px;
 +  margin-left: 2em; }
 +
 +.login-dialog-auth-list-title {
 +  margin-left: 2em; }
 +
 +.login-dialog-auth-list-item {
 +  border-radius: 16px;
 +  padding: 4px;
-       color: whitesmoke;
-       background-color: st-mix(whitesmoke, #282828, 9%);
++  color: #a5a5b7; }
 +  .login-dialog-auth-list-item:focus, .login-dialog-auth-list-item:selected {
 +    background-color: -st-accent-color;
 +    color: -st-accent-fg-color; }
 +
 +.login-dialog-auth-list-label:ltr {
 +  padding-left: 15px;
 +  text-align: left; }
 +
 +.login-dialog-auth-list-label:rtl {
 +  padding-right: 15px;
 +  text-align: right; }
 +
 +.login-dialog-user-list-view {
 +  width: 25em;
 +  -st-vfade-offset: 3em; }
 +  .login-dialog-user-list-view .login-dialog-user-list {
 +    margin: 0 8px;
 +    spacing: 12px; }
 +    .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item {
-         color: whitesmoke;
-         box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-         background-color: st-mix(-st-accent-color, st-mix(whitesmoke, #282828, 9%), 5%); }
++      color: #fafafb;
++      background-color: st-mix(#fafafb, #222226, 9%);
 +      border-radius: 16px;
 +      padding: 9px; }
 +      .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:selected, .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:focus {
-           background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 9%), 4%), 5%); }
++        color: #fafafb;
++        box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#fafafb, #222226, 9%), 5%); }
 +        .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:selected:hover, .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:focus:hover {
-         color: whitesmoke;
-         background-color: st-lighten(st-mix(whitesmoke, #282828, 9%), 4%); }
++          background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #222226, 9%), 4%), 5%); }
 +      .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:hover {
-         color: whitesmoke;
-         background-color: st-lighten(st-mix(whitesmoke, #282828, 9%), 9%); }
++        color: #fafafb;
++        background-color: st-lighten(st-mix(#fafafb, #222226, 9%), 4%); }
 +      .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active {
-           background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 9%), 9%), 4%); }
++        color: #fafafb;
++        background-color: st-lighten(st-mix(#fafafb, #222226, 9%), 9%); }
 +        .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active:hover {
-           background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 9%), 9%), 5%); }
++          background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 9%), 9%), 4%); }
 +        .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active:focus {
-         background-color: rgba(245, 245, 245, 0.7); }
++          background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #222226, 9%), 9%), 5%); }
 +      .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item .user-icon {
 +        border: 2px solid transparent; }
 +      .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item .login-dialog-timed-login-indicator {
 +        height: 2px;
 +        margin-top: 6px;
-   background-color: #282828; }
++        background-color: rgba(250, 250, 251, 0.7); }
 +      .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:logged-in .user-icon {
 +        border-color: -st-accent-color; }
 +        .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:logged-in .user-icon StIcon {
 +          background-color: st-transparentize(-st-accent-color, 0.7); }
 +
 +.unlock-dialog {
 +  background-color: transparent; }
 +
 +.screen-shield-background {
 +  background: black;
 +  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.6); }
 +
 +#lockDialogGroup {
-   color: whitesmoke;
++  background-color: #222226; }
 +
 +.unlock-dialog-clock {
-   background-color: rgba(53, 53, 53, 0.3); }
++  color: #fafafb;
 +  spacing: 2em; }
 +  .unlock-dialog-clock .unlock-dialog-clock-time {
 +    font-size: 6.546em;
 +    font-weight: 800; }
 +  .unlock-dialog-clock .unlock-dialog-clock-date {
 +    font-weight: 400; }
 +  .unlock-dialog-clock .unlock-dialog-clock-hint {
 +    margin-top: 2em;
 +    padding: 6px 18px;
 +    border-radius: 16px;
 +    font-weight: bold; }
 +
 +#unlockDialogNotifications StButton#vhandle, #unlockDialogNotifications StButton#hhandle {
-     background-color: rgba(53, 53, 53, 0.5); }
++  background-color: rgba(54, 54, 58, 0.3); }
 +  #unlockDialogNotifications StButton#vhandle:hover, #unlockDialogNotifications StButton#vhandle:focus, #unlockDialogNotifications StButton#hhandle:hover, #unlockDialogNotifications StButton#hhandle:focus {
-     background-color: rgba(245, 245, 245, 0.1);
-     color: whitesmoke;
++    background-color: rgba(54, 54, 58, 0.5); }
 +  #unlockDialogNotifications StButton#vhandle:active, #unlockDialogNotifications StButton#hhandle:active {
 +    background-color: st-transparentize(-st-accent-color, 0.5); }
 +
 +.unlock-dialog-notifications-container {
 +  margin: 12px;
 +  spacing: 6px;
 +  width: 25em;
 +  background-color: transparent; }
 +  .unlock-dialog-notifications-container .summary-notification-stack-scrollview {
 +    padding-top: 0;
 +    padding-bottom: 0; }
 +  .unlock-dialog-notifications-container .notification,
 +  .unlock-dialog-notifications-container .unlock-dialog-notification-source {
 +    padding: 12px 16px;
 +    border: none;
-       background-color: rgba(245, 245, 245, 0.2); }
++    background-color: rgba(250, 250, 251, 0.1);
++    color: #fafafb;
 +    border-radius: 16px; }
 +    .unlock-dialog-notifications-container .notification.critical,
 +    .unlock-dialog-notifications-container .unlock-dialog-notification-source.critical {
-   color: whitesmoke;
-   background-color: rgba(245, 245, 245, 0.1);
++      background-color: rgba(250, 250, 251, 0.2); }
 +
 +.unlock-dialog-notification-icon {
 +  icon-size: 32px; }
 +
 +.unlock-dialog-notification-label {
 +  padding-left: 12px;
 +  padding-right: 0; }
 +  .unlock-dialog-notification-label:rtl {
 +    padding-right: 12px;
 +    padding-left: 0; }
 +
 +.unlock-dialog-notification-count-text {
 +  font-weight: bold;
 +  padding: 0 12px;
-   color: whitesmoke; }
++  color: #fafafb;
++  background-color: rgba(250, 250, 251, 0.1);
 +  border-radius: 999px; }
 +
 +.login-dialog .user-widget .user-widget-label,
 +.unlock-dialog .user-widget .user-widget-label {
-   background-color: rgba(245, 245, 245, 0.13);
-   color: whitesmoke; }
++  color: #fafafb; }
 +
 +.login-dialog .user-widget .user-icon,
 +.unlock-dialog .user-widget .user-icon {
++  background-color: rgba(250, 250, 251, 0.13);
++  color: #fafafb; }
 +
 +.login-dialog .user-widget.horizontal,
 +.unlock-dialog .user-widget.horizontal {
 +  spacing: 18px; }
 +
 +.login-dialog .user-widget.vertical,
 +.unlock-dialog .user-widget.vertical {
 +  spacing: 24px; }
 +  .login-dialog .user-widget.vertical .user-widget-label,
 +  .unlock-dialog .user-widget.vertical .user-widget-label {
 +    font-weight: 400;
 +    font-size: 1.818em;
 +    text-align: center;
 +    margin-bottom: .75em; }
 +  .login-dialog .user-widget.vertical .user-icon,
 +  .unlock-dialog .user-widget.vertical .user-icon {
 +    icon-size: 160px; }
 +    .login-dialog .user-widget.vertical .user-icon StIcon,
 +    .unlock-dialog .user-widget.vertical .user-icon StIcon {
 +      padding: 30px; }
index 8ce52ba4f168a725b56503abd92ff35c396c3937,0000000000000000000000000000000000000000..3bc958979e3e63af1695b3547ec8f7792084b8ab
mode 100644,000000..100644
--- /dev/null
@@@ -1,3570 -1,0 +1,3549 @@@
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); }
 +/* This stylesheet is generated, DO NOT EDIT */
 +/* Copyright 2009, 2015 Red Hat, Inc.
 + *
 + * Portions adapted from Mx's data/style/default.css
 + *   Copyright 2009 Intel Corporation
 + *
 + * This program is free software; you can redistribute it and/or modify it
 + * under the terms and conditions of the GNU Lesser General Public License,
 + * version 2.1, as published by the Free Software Foundation.
 + *
 + * This program is distributed in the hope it will be useful, but WITHOUT ANY
 + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 + * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
 + * more details.
 + *
 + * You should have received a copy of the GNU Lesser General Public License
 + * along with this program; if not, write to the Free Software Foundation,
 + * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
 + */
 +/* Global Values */
 +stage {
 +  font-size: 1em;
 +  color: #ffffff; }
 +
 +/* Common Stylings */
 +#dash .dash-item-container .show-apps,
 +#dash .dash-item-container .overview-tile,
 +#dash .dash-item-container .grid-search-result {
 +  background: none;
 +  box-shadow: none;
 +  border: none;
 +  border-radius: 0;
 +  padding: 0;
 +  margin: 0; }
 +
 +.app-folder-dialog .overview-tile, .app-folder-dialog .grid-search-result, .app-folder, .overview-tile, .grid-search-result, #dash .dash-item-container .show-apps .overview-icon,
 +#dash .dash-item-container .overview-tile .overview-icon,
 +#dash .dash-item-container .grid-search-result .overview-icon, .list-search-result, .search-provider-icon, .switcher-list .item-box, .audio-device-selection-dialog .audio-selection-box .audio-selection-device {
 +  border-radius: 16px;
 +  padding: 6px;
 +  spacing: 6px;
 +  text-align: center;
 +  transition-duration: 100ms; }
 +
 +.login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item, .login-dialog-not-listed-button, .unlock-dialog .button,
 +.unlock-dialog .icon-button,
 +.unlock-dialog .message .message-header .message-expand-button,
 +.message .message-header .unlock-dialog .message-expand-button,
 +.unlock-dialog .message .message-header .message-close-button,
 +.message .message-header .unlock-dialog .message-close-button,
 +.unlock-dialog .screenshot-ui-show-pointer-button, #LookingGlassDialog .notebook-tab, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button, #LookingGlassDebugFlags .lg-debug-flag-button, #LookingGlassPropertyInspector .lg-obj-inspector-close-button,
 +#LookingGlassPropertyInspector .lg-obj-inspector-button, #LookingGlassDialog > #Toolbar .lg-toolbar-button, .icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .message .message-header .message-expand-button,
 +.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button, .button {
 +  border-radius: 8px;
 +  padding: 3px 24px;
 +  font-weight: bold;
 +  transition: border-width 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), box-shadow 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94); }
 +
 +.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .screenshot-ui-show-pointer-button, .message .message-header .message-expand-button,
 +.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button, .button {
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  color: #ffffff;
 +  background-color: st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%); }
 +  .icon-button:focus, .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus, .screenshot-ui-show-pointer-button:focus, .message .message-header .message-expand-button:focus,
 +  .message .message-header .message-close-button:focus, .calendar .calendar-month-header .pager-button:focus, .button:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); }
 +    .icon-button:focus:hover, .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .message .message-header .message-expand-button:focus:hover,
 +    .message .message-header .message-close-button:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .button:focus:hover {
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 9%), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); }
 +  .icon-button:hover, .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover, .screenshot-ui-show-pointer-button:hover, .message .message-header .message-expand-button:hover,
 +  .message .message-header .message-close-button:hover, .calendar .calendar-month-header .pager-button:hover, .button:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%); }
 +  .icon-button:insensitive, .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive, .screenshot-ui-show-pointer-button:insensitive, .message .message-header .message-expand-button:insensitive,
 +  .message .message-header .message-close-button:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .button:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: st-transparentize(#ffffff, 0.5);
 +    background-color: st-darken(st-mix(#ffffff, #1a1a1a, 9%), 3%);
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none; }
 +  .icon-button:selected, .login-dialog-button.cancel-button:selected, .login-dialog-button.switch-user-button:selected, .login-dialog-button.login-dialog-session-list-button:selected, .screenshot-ui-show-pointer-button:selected, .message .message-header .message-expand-button:selected,
 +  .message .message-header .message-close-button:selected, .calendar .calendar-month-header .pager-button:selected, .button:selected, .icon-button:active, .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active, .screenshot-ui-show-pointer-button:active, .message .message-header .message-expand-button:active,
 +  .message .message-header .message-close-button:active, .calendar .calendar-month-header .pager-button:active, .button:active {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 9%), #ffffff, 87%); }
 +    .icon-button:selected:hover, .login-dialog-button.cancel-button:selected:hover, .login-dialog-button.switch-user-button:selected:hover, .login-dialog-button.login-dialog-session-list-button:selected:hover, .screenshot-ui-show-pointer-button:selected:hover, .message .message-header .message-expand-button:selected:hover,
 +    .message .message-header .message-close-button:selected:hover, .calendar .calendar-month-header .pager-button:selected:hover, .button:selected:hover, .icon-button:active:hover, .login-dialog-button.cancel-button:active:hover, .login-dialog-button.switch-user-button:active:hover, .login-dialog-button.login-dialog-session-list-button:active:hover, .screenshot-ui-show-pointer-button:active:hover, .message .message-header .message-expand-button:active:hover,
 +    .message .message-header .message-close-button:active:hover, .calendar .calendar-month-header .pager-button:active:hover, .button:active:hover {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 9%), 4%); }
 +    .icon-button:selected:focus, .login-dialog-button.cancel-button:selected:focus, .login-dialog-button.switch-user-button:selected:focus, .login-dialog-button.login-dialog-session-list-button:selected:focus, .screenshot-ui-show-pointer-button:selected:focus, .message .message-header .message-expand-button:selected:focus,
 +    .message .message-header .message-close-button:selected:focus, .calendar .calendar-month-header .pager-button:selected:focus, .button:selected:focus, .icon-button:active:focus, .login-dialog-button.cancel-button:active:focus, .login-dialog-button.switch-user-button:active:focus, .login-dialog-button.login-dialog-session-list-button:active:focus, .screenshot-ui-show-pointer-button:active:focus, .message .message-header .message-expand-button:active:focus,
 +    .message .message-header .message-close-button:active:focus, .calendar .calendar-month-header .pager-button:active:focus, .button:active:focus {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, rgba(26, 26, 26, 0.25), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 9%), #ffffff, 87%), 5%); }
 +  .icon-button:checked, .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked, .screenshot-ui-show-pointer-button:checked, .message .message-header .message-expand-button:checked,
 +  .message .message-header .message-close-button:checked, .calendar .calendar-month-header .pager-button:checked, .button:checked {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), #ffffff, 87%); }
 +    .icon-button:checked:hover, .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .message .message-header .message-expand-button:checked:hover,
 +    .message .message-header .message-close-button:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .button:checked:hover {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 4%); }
 +    .icon-button:checked:active, .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active, .screenshot-ui-show-pointer-button:checked:active, .message .message-header .message-expand-button:checked:active,
 +    .message .message-header .message-close-button:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .button:checked:active {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 9%); }
 +
 +.calendar .calendar-day-heading, .calendar .calendar-day, .calendar .calendar-month-header .calendar-month-label, .icon-button.flat, .flat.login-dialog-button.cancel-button, .flat.login-dialog-button.switch-user-button, .flat.login-dialog-button.login-dialog-session-list-button, .flat.screenshot-ui-show-pointer-button, .message .message-header .flat.message-expand-button,
 +.message .message-header .flat.message-close-button, .calendar .calendar-month-header .pager-button, .button.flat {
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  color: #ffffff;
 +  background-color: #1a1a1a;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  box-shadow: none;
 +  border: none; }
 +  .calendar .calendar-day-heading:focus, .calendar .calendar-day:focus, .calendar .calendar-month-header .calendar-month-label:focus, .icon-button.flat:focus, .flat.login-dialog-button.cancel-button:focus, .flat.login-dialog-button.switch-user-button:focus, .flat.login-dialog-button.login-dialog-session-list-button:focus, .flat.screenshot-ui-show-pointer-button:focus, .message .message-header .flat.message-expand-button:focus,
 +  .message .message-header .flat.message-close-button:focus, .calendar .calendar-month-header .pager-button:focus, .button.flat:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(#1a1a1a, 7%), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(26, 26, 26, 0.25), 5%); }
 +    .calendar .calendar-day-heading:focus:hover, .calendar .calendar-day:focus:hover, .calendar .calendar-month-header .calendar-month-label:focus:hover, .icon-button.flat:focus:hover, .flat.login-dialog-button.cancel-button:focus:hover, .flat.login-dialog-button.switch-user-button:focus:hover, .flat.login-dialog-button.login-dialog-session-list-button:focus:hover, .flat.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .flat.message-expand-button:focus:hover,
 +    .message .message-header .flat.message-close-button:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .button.flat:focus:hover {
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#1a1a1a, 7%), #ffffff, 87%), 5%); }
 +  .calendar .calendar-day-heading:hover, .calendar .calendar-day:hover, .calendar .calendar-month-header .calendar-month-label:hover, .icon-button.flat:hover, .flat.login-dialog-button.cancel-button:hover, .flat.login-dialog-button.switch-user-button:hover, .flat.login-dialog-button.login-dialog-session-list-button:hover, .flat.screenshot-ui-show-pointer-button:hover, .message .message-header .flat.message-expand-button:hover,
 +  .message .message-header .flat.message-close-button:hover, .calendar .calendar-month-header .pager-button:hover, .button.flat:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#1a1a1a, 7%), #ffffff, 87%); }
 +  .calendar .calendar-day-heading:insensitive, .calendar .calendar-day:insensitive, .calendar .calendar-month-header .calendar-month-label:insensitive, .icon-button.flat:insensitive, .flat.login-dialog-button.cancel-button:insensitive, .flat.login-dialog-button.switch-user-button:insensitive, .flat.login-dialog-button.login-dialog-session-list-button:insensitive, .flat.screenshot-ui-show-pointer-button:insensitive, .message .message-header .flat.message-expand-button:insensitive,
 +  .message .message-header .flat.message-close-button:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .button.flat:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: st-transparentize(#ffffff, 0.5);
 +    background-color: #1a1a1a;
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none; }
 +  .calendar .calendar-day-heading:selected, .calendar .calendar-day:selected, .calendar .calendar-month-header .calendar-month-label:selected, .icon-button.flat:selected, .flat.login-dialog-button.cancel-button:selected, .flat.login-dialog-button.switch-user-button:selected, .flat.login-dialog-button.login-dialog-session-list-button:selected, .flat.screenshot-ui-show-pointer-button:selected, .message .message-header .flat.message-expand-button:selected,
 +  .message .message-header .flat.message-close-button:selected, .calendar .calendar-month-header .pager-button:selected, .button.flat:selected, .calendar .calendar-day-heading:active, .calendar .calendar-day:active, .calendar .calendar-month-header .calendar-month-label:active, .icon-button.flat:active, .flat.login-dialog-button.cancel-button:active, .flat.login-dialog-button.switch-user-button:active, .flat.login-dialog-button.login-dialog-session-list-button:active, .flat.screenshot-ui-show-pointer-button:active, .message .message-header .flat.message-expand-button:active,
 +  .message .message-header .flat.message-close-button:active, .calendar .calendar-month-header .pager-button:active, .button.flat:active {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%); }
 +    .calendar .calendar-day-heading:selected:hover, .calendar .calendar-day:selected:hover, .calendar .calendar-month-header .calendar-month-label:selected:hover, .icon-button.flat:selected:hover, .flat.login-dialog-button.cancel-button:selected:hover, .flat.login-dialog-button.switch-user-button:selected:hover, .flat.login-dialog-button.login-dialog-session-list-button:selected:hover, .flat.screenshot-ui-show-pointer-button:selected:hover, .message .message-header .flat.message-expand-button:selected:hover,
 +    .message .message-header .flat.message-close-button:selected:hover, .calendar .calendar-month-header .pager-button:selected:hover, .button.flat:selected:hover, .calendar .calendar-day-heading:active:hover, .calendar .calendar-day:active:hover, .calendar .calendar-month-header .calendar-month-label:active:hover, .icon-button.flat:active:hover, .flat.login-dialog-button.cancel-button:active:hover, .flat.login-dialog-button.switch-user-button:active:hover, .flat.login-dialog-button.login-dialog-session-list-button:active:hover, .flat.screenshot-ui-show-pointer-button:active:hover, .message .message-header .flat.message-expand-button:active:hover,
 +    .message .message-header .flat.message-close-button:active:hover, .calendar .calendar-month-header .pager-button:active:hover, .button.flat:active:hover {
 +      background-color: st-lighten(st-lighten(#1a1a1a, 9%), 7%); }
 +    .calendar .calendar-day-heading:selected:focus, .calendar .calendar-day:selected:focus, .calendar .calendar-month-header .calendar-month-label:selected:focus, .icon-button.flat:selected:focus, .flat.login-dialog-button.cancel-button:selected:focus, .flat.login-dialog-button.switch-user-button:selected:focus, .flat.login-dialog-button.login-dialog-session-list-button:selected:focus, .flat.screenshot-ui-show-pointer-button:selected:focus, .message .message-header .flat.message-expand-button:selected:focus,
 +    .message .message-header .flat.message-close-button:selected:focus, .calendar .calendar-month-header .pager-button:selected:focus, .button.flat:selected:focus, .calendar .calendar-day-heading:active:focus, .calendar .calendar-day:active:focus, .calendar .calendar-month-header .calendar-month-label:active:focus, .icon-button.flat:active:focus, .flat.login-dialog-button.cancel-button:active:focus, .flat.login-dialog-button.switch-user-button:active:focus, .flat.login-dialog-button.login-dialog-session-list-button:active:focus, .flat.screenshot-ui-show-pointer-button:active:focus, .message .message-header .flat.message-expand-button:active:focus,
 +    .message .message-header .flat.message-close-button:active:focus, .calendar .calendar-month-header .pager-button:active:focus, .button.flat:active:focus {
- .keyboard-brightness-level .button:checked, .quick-menu-toggle .quick-toggle-arrow:checked, .quick-toggle:checked, .calendar .calendar-day.calendar-today, .icon-button.default, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .default.screenshot-ui-show-pointer-button, .message .message-header .default.message-expand-button,
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%), 5%); }
 +  .calendar .calendar-day-heading:checked, .calendar .calendar-day:checked, .calendar .calendar-month-header .calendar-month-label:checked, .icon-button.flat:checked, .flat.login-dialog-button.cancel-button:checked, .flat.login-dialog-button.switch-user-button:checked, .flat.login-dialog-button.login-dialog-session-list-button:checked, .flat.screenshot-ui-show-pointer-button:checked, .message .message-header .flat.message-expand-button:checked,
 +  .message .message-header .flat.message-close-button:checked, .calendar .calendar-month-header .pager-button:checked, .button.flat:checked {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#1a1a1a, 8%), #ffffff, 87%); }
 +    .calendar .calendar-day-heading:checked:hover, .calendar .calendar-day:checked:hover, .calendar .calendar-month-header .calendar-month-label:checked:hover, .icon-button.flat:checked:hover, .flat.login-dialog-button.cancel-button:checked:hover, .flat.login-dialog-button.switch-user-button:checked:hover, .flat.login-dialog-button.login-dialog-session-list-button:checked:hover, .flat.screenshot-ui-show-pointer-button:checked:hover, .message .message-header .flat.message-expand-button:checked:hover,
 +    .message .message-header .flat.message-close-button:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .button.flat:checked:hover {
 +      background-color: st-lighten(st-lighten(#1a1a1a, 8%), 7%); }
 +    .calendar .calendar-day-heading:checked:active, .calendar .calendar-day:checked:active, .calendar .calendar-month-header .calendar-month-label:checked:active, .icon-button.flat:checked:active, .flat.login-dialog-button.cancel-button:checked:active, .flat.login-dialog-button.switch-user-button:checked:active, .flat.login-dialog-button.login-dialog-session-list-button:checked:active, .flat.screenshot-ui-show-pointer-button:checked:active, .message .message-header .flat.message-expand-button:checked:active,
 +    .message .message-header .flat.message-close-button:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .button.flat:checked:active {
 +      background-color: st-lighten(st-lighten(#1a1a1a, 8%), 9%); }
 +
-   .keyboard-brightness-level .button:focus:checked, .quick-menu-toggle .quick-toggle-arrow:focus:checked, .quick-toggle:focus:checked, .calendar .calendar-day.calendar-today:focus, .icon-button.default:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .default.screenshot-ui-show-pointer-button:focus, .message .message-header .default.message-expand-button:focus,
++.keyboard-brightness-level .button:checked, .quick-toggle:checked, .calendar .calendar-day.calendar-today, .icon-button.default, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .default.screenshot-ui-show-pointer-button, .message .message-header .default.message-expand-button,
 +.message .message-header .default.message-close-button, .calendar .calendar-month-header .default.pager-button, .button.default {
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  box-shadow: none;
 +  border: none;
 +  color: -st-accent-fg-color;
 +  background-color: st-mix(-st-accent-color, #ffffff, 87%); }
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     box-shadow: inset 0 0 0 2px st-lighten(-st-accent-color, 30%) !important;
-     background-color: st-mix(-st-accent-color, st-mix(-st-accent-color, #ffffff, 87%), 5%); }
-     .keyboard-brightness-level .button:focus:hover:checked, .quick-menu-toggle .quick-toggle-arrow:focus:hover:checked, .quick-toggle:focus:hover:checked, .calendar .calendar-day.calendar-today:focus:hover, .icon-button.default:focus:hover, .default.login-dialog-button.cancel-button:focus:hover, .default.login-dialog-button.switch-user-button:focus:hover, .default.login-dialog-button.login-dialog-session-list-button:focus:hover, .default.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .default.message-expand-button:focus:hover,
++  .keyboard-brightness-level .button:focus:checked, .quick-toggle:focus:checked, .calendar .calendar-day.calendar-today:focus, .icon-button.default:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .default.screenshot-ui-show-pointer-button:focus, .message .message-header .default.message-expand-button:focus,
 +  .message .message-header .default.message-close-button:focus, .calendar .calendar-month-header .default.pager-button:focus, .button.default:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none;
 +    color: -st-accent-fg-color;
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(-st-accent-color, 4%), #ffffff, 87%), 5%); }
-   .keyboard-brightness-level .button:hover:checked, .quick-menu-toggle .quick-toggle-arrow:hover:checked, .quick-toggle:hover:checked, .calendar .calendar-day.calendar-today:hover, .icon-button.default:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .default.screenshot-ui-show-pointer-button:hover, .message .message-header .default.message-expand-button:hover,
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    box-shadow: inset 0 0 0 2px st-transparentize(st-lighten(-st-accent-color, 30%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(-st-accent-color, #ffffff, 87%), 5%); }
++    .keyboard-brightness-level .button:focus:hover:checked, .quick-toggle:focus:hover:checked, .calendar .calendar-day.calendar-today:focus:hover, .icon-button.default:focus:hover, .default.login-dialog-button.cancel-button:focus:hover, .default.login-dialog-button.switch-user-button:focus:hover, .default.login-dialog-button.login-dialog-session-list-button:focus:hover, .default.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .default.message-expand-button:focus:hover,
 +    .message .message-header .default.message-close-button:focus:hover, .calendar .calendar-month-header .default.pager-button:focus:hover, .button.default:focus:hover {
-   .keyboard-brightness-level .button:insensitive:checked, .quick-menu-toggle .quick-toggle-arrow:insensitive:checked, .quick-toggle:insensitive:checked, .calendar .calendar-day.calendar-today:insensitive, .icon-button.default:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .default.screenshot-ui-show-pointer-button:insensitive, .message .message-header .default.message-expand-button:insensitive,
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(-st-accent-color, 4%), #ffffff, 87%), 5%); }
++  .keyboard-brightness-level .button:hover:checked, .quick-toggle:hover:checked, .calendar .calendar-day.calendar-today:hover, .icon-button.default:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .default.screenshot-ui-show-pointer-button:hover, .message .message-header .default.message-expand-button:hover,
 +  .message .message-header .default.message-close-button:hover, .calendar .calendar-month-header .default.pager-button:hover, .button.default:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none;
 +    color: -st-accent-fg-color;
 +    background-color: st-mix(st-lighten(-st-accent-color, 4%), #ffffff, 87%); }
-   .keyboard-brightness-level .button:active:checked, .quick-menu-toggle .quick-toggle-arrow:active:checked, .quick-toggle:active:checked, .calendar .calendar-day.calendar-today:active, .icon-button.default:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .default.screenshot-ui-show-pointer-button:active, .message .message-header .default.message-expand-button:active,
++  .keyboard-brightness-level .button:insensitive:checked, .quick-toggle:insensitive:checked, .calendar .calendar-day.calendar-today:insensitive, .icon-button.default:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .default.screenshot-ui-show-pointer-button:insensitive, .message .message-header .default.message-expand-button:insensitive,
 +  .message .message-header .default.message-close-button:insensitive, .calendar .calendar-month-header .default.pager-button:insensitive, .button.default:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none;
 +    color: st-transparentize(-st-accent-fg-color, 0.5);
 +    background-color: st-darken(-st-accent-color, 3%);
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none; }
-     .keyboard-brightness-level .button:active:hover:checked, .quick-menu-toggle .quick-toggle-arrow:active:hover:checked, .quick-toggle:active:hover:checked, .calendar .calendar-day.calendar-today:active:hover, .icon-button.default:active:hover, .default.login-dialog-button.cancel-button:active:hover, .default.login-dialog-button.switch-user-button:active:hover, .default.login-dialog-button.login-dialog-session-list-button:active:hover, .default.screenshot-ui-show-pointer-button:active:hover, .message .message-header .default.message-expand-button:active:hover,
++  .keyboard-brightness-level .button:active:checked, .quick-toggle:active:checked, .calendar .calendar-day.calendar-today:active, .icon-button.default:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .default.screenshot-ui-show-pointer-button:active, .message .message-header .default.message-expand-button:active,
 +  .message .message-header .default.message-close-button:active, .calendar .calendar-month-header .default.pager-button:active, .button.default:active {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none;
 +    color: -st-accent-fg-color;
 +    background-color: st-mix(st-lighten(-st-accent-color, 9%), #ffffff, 87%); }
-     .keyboard-brightness-level .button:active:focus:checked, .quick-menu-toggle .quick-toggle-arrow:active:focus:checked, .quick-toggle:active:focus:checked, .calendar .calendar-day.calendar-today:active:focus, .icon-button.default:active:focus, .default.login-dialog-button.cancel-button:active:focus, .default.login-dialog-button.switch-user-button:active:focus, .default.login-dialog-button.login-dialog-session-list-button:active:focus, .default.screenshot-ui-show-pointer-button:active:focus, .message .message-header .default.message-expand-button:active:focus,
++    .keyboard-brightness-level .button:active:hover:checked, .quick-toggle:active:hover:checked, .calendar .calendar-day.calendar-today:active:hover, .icon-button.default:active:hover, .default.login-dialog-button.cancel-button:active:hover, .default.login-dialog-button.switch-user-button:active:hover, .default.login-dialog-button.login-dialog-session-list-button:active:hover, .default.screenshot-ui-show-pointer-button:active:hover, .message .message-header .default.message-expand-button:active:hover,
 +    .message .message-header .default.message-close-button:active:hover, .calendar .calendar-month-header .default.pager-button:active:hover, .button.default:active:hover {
 +      background-color: st-lighten(st-lighten(-st-accent-color, 9%), 4%); }
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(-st-accent-color, 9%), #ffffff, 87%), 5%); }
++    .keyboard-brightness-level .button:active:focus:checked, .quick-toggle:active:focus:checked, .calendar .calendar-day.calendar-today:active:focus, .icon-button.default:active:focus, .default.login-dialog-button.cancel-button:active:focus, .default.login-dialog-button.switch-user-button:active:focus, .default.login-dialog-button.login-dialog-session-list-button:active:focus, .default.screenshot-ui-show-pointer-button:active:focus, .message .message-header .default.message-expand-button:active:focus,
 +    .message .message-header .default.message-close-button:active:focus, .calendar .calendar-month-header .default.pager-button:active:focus, .button.default:active:focus {
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(-st-accent-color, 9%), #ffffff, 87%), 5%); }
 +
 +.popup-sub-menu .popup-menu-item, .popup-menu-item {
 +  font-weight: normal;
 +  spacing: 6px;
 +  transition-duration: 100ms;
 +  padding: 9px 12px; }
 +
 +#LookingGlassExtensions .lg-extension, #LookingGlassWindows .lg-window, .calendar, .datemenu-today-button, .quick-toggle-menu, .message, .events-button,
 +.world-clocks-button,
 +.weather-button {
 +  border-radius: 12px;
 +  padding: 0.818em;
 +  margin: 4px;
 +  background-color: #1a1a1a;
 +  box-shadow: 0 1px 2px 0 transparent;
 +  border: 1px solid #1a1a1a;
 +  border-color: transparent;
 +  box-shadow: none; }
 +
 +.quick-toggle-menu, .message, .events-button,
 +.world-clocks-button,
 +.weather-button {
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  color: #ffffff;
 +  background-color: st-mix(#1a1a1a, #ffffff, 87%); }
 +  .quick-toggle-menu:hover, .message:hover, .events-button:hover,
 +  .world-clocks-button:hover,
 +  .weather-button:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#1a1a1a, 4%), #ffffff, 87%); }
 +  .quick-toggle-menu:active, .message:active, .events-button:active,
 +  .world-clocks-button:active,
 +  .weather-button:active {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%); }
 +    .quick-toggle-menu:active:hover, .message:active:hover, .events-button:active:hover,
 +    .world-clocks-button:active:hover,
 +    .weather-button:active:hover {
 +      background-color: st-lighten(st-lighten(#1a1a1a, 9%), 4%); }
 +    .quick-toggle-menu:active:focus, .message:active:focus, .events-button:active:focus,
 +    .world-clocks-button:active:focus,
 +    .weather-button:active:focus {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, st-mix(#1a1a1a, #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%), 5%); }
 +  .quick-toggle-menu:focus, .message:focus, .events-button:focus,
 +  .world-clocks-button:focus,
 +  .weather-button:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(#1a1a1a, 4%), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#1a1a1a, #ffffff, 87%), 5%); }
 +    .quick-toggle-menu:focus:hover, .message:focus:hover, .events-button:focus:hover,
 +    .world-clocks-button:focus:hover,
 +    .weather-button:focus:hover {
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#1a1a1a, 4%), #ffffff, 87%), 5%); }
 +  .quick-toggle-menu:insensitive, .message:insensitive, .events-button:insensitive,
 +  .world-clocks-button:insensitive,
 +  .weather-button:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: st-transparentize(#ffffff, 0.5);
 +    background-color: st-darken(#1a1a1a, 3%);
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none; }
 +
 +.calendar, .datemenu-today-button {
 +  border: 1px solid transparent !important;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  background-color: transparent;
 +  border-color: transparent;
 +  box-shadow: none; }
 +  .calendar:insensitive, .datemenu-today-button:insensitive {
 +    background-color: transparent !important; }
 +  .calendar:hover, .datemenu-today-button:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#1a1a1a, 7%), #ffffff, 87%); }
 +  .calendar:active, .datemenu-today-button:active {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%); }
 +    .calendar:active:hover, .datemenu-today-button:active:hover {
 +      background-color: st-lighten(st-lighten(#1a1a1a, 9%), 7%); }
 +    .calendar:active:focus, .datemenu-today-button:active:focus {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, st-mix(#1a1a1a, #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%), 5%); }
 +  .calendar:focus, .datemenu-today-button:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(#1a1a1a, 4%), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#1a1a1a, #ffffff, 87%), 5%); }
 +    .calendar:focus:hover, .datemenu-today-button:focus:hover {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, #2e2e2e, 5%);
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#1a1a1a, 4%), #ffffff, 87%), 5%); }
 +  .calendar:insensitive, .datemenu-today-button:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: st-transparentize(#ffffff, 0.5);
 +    background-color: st-darken(#1a1a1a, 3%);
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none; }
 +
 +.unlock-dialog .login-dialog-prompt-entry, .login-dialog .login-dialog-prompt-entry, .app-folder-dialog .folder-name-container .folder-name-entry, .search-entry, .lg-dialog StEntry, StEntry {
 +  border-radius: 8px;
 +  padding: 9px 9px;
 +  selection-background-color: st-transparentize(-st-accent-color, 0.7);
 +  selected-color: #ffffff; }
 +
 +StEntry {
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  background-color: #2e2e2e;
 +  color: rgba(255, 255, 255, 0.7); }
 +  StEntry:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    background-color: #383838;
 +    color: #ffffff; }
 +  StEntry:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.15), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #2e2e2e, 5%);
 +    color: #ffffff; }
 +  StEntry:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    background-color: #262626;
 +    color: rgba(255, 255, 255, 0.5); }
 +  StEntry StLabel.hint-text {
 +    color: rgba(255, 255, 255, 0.7); }
 +
 +.notification-button, .message .message-header .message-expand-button,
 +.message .message-header .message-close-button {
 +  font-weight: bold;
 +  padding: 6px 12px;
 +  border-radius: 8px;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  color: #ffffff;
 +  background-color: st-mix(rgba(255, 255, 255, 0.15), #ffffff, 87%); }
 +  .notification-button:focus, .message .message-header .message-expand-button:focus,
 +  .message .message-header .message-close-button:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.3), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.15), #ffffff, 87%), 5%); }
 +    .notification-button:focus:hover, .message .message-header .message-expand-button:focus:hover,
 +    .message .message-header .message-close-button:focus:hover {
-       background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.2), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.3), #ffffff, 87%), 5%); }
 +  .notification-button:hover, .message .message-header .message-expand-button:hover,
 +  .message .message-header .message-close-button:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(rgba(255, 255, 255, 0.3), #ffffff, 87%); }
 +  .notification-button:active, .message .message-header .message-expand-button:active,
 +  .message .message-header .message-close-button:active {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(rgba(255, 255, 255, 0.2), #ffffff, 87%); }
 +    .notification-button:active:hover, .message .message-header .message-expand-button:active:hover,
 +    .message .message-header .message-close-button:active:hover {
 +      background-color: rgba(255, 255, 255, 0.2); }
 +    .notification-button:active:focus, .message .message-header .message-expand-button:active:focus,
 +    .message .message-header .message-close-button:active:focus {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.1), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.2), #ffffff, 87%), 5%); }
 +  .notification-button:checked, .message .message-header .message-expand-button:checked,
 +  .message .message-header .message-close-button:checked {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), #ffffff, 87%); }
 +    .notification-button:checked:hover, .message .message-header .message-expand-button:checked:hover,
 +    .message .message-header .message-close-button:checked:hover {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 4%); }
 +    .notification-button:checked:active, .message .message-header .message-expand-button:checked:active,
 +    .message .message-header .message-close-button:checked:active {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 9%); }
 +  .notification-button:insensitive, .message .message-header .message-expand-button:insensitive,
 +  .message .message-header .message-close-button:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: st-transparentize(#ffffff, 0.5);
 +    background-color: rgba(255, 255, 255, 0.1);
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none; }
 +
 +.modal-dialog .modal-dialog-button-box .modal-dialog-button {
 +  font-weight: bold;
 +  padding: 12px;
 +  border-radius: 12px;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  color: #ffffff;
 +  background-color: st-mix(rgba(255, 255, 255, 0.1), #ffffff, 87%); }
 +  .modal-dialog .modal-dialog-button-box .modal-dialog-button:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.13), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.1), #ffffff, 87%), 5%); }
 +    .modal-dialog .modal-dialog-button-box .modal-dialog-button:focus:hover {
-       background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.16), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.13), #ffffff, 87%), 5%); }
 +  .modal-dialog .modal-dialog-button-box .modal-dialog-button:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(rgba(255, 255, 255, 0.13), #ffffff, 87%); }
 +  .modal-dialog .modal-dialog-button-box .modal-dialog-button:active {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(rgba(255, 255, 255, 0.16), #ffffff, 87%); }
 +    .modal-dialog .modal-dialog-button-box .modal-dialog-button:active:hover {
 +      background-color: rgba(255, 255, 255, 0.19); }
 +    .modal-dialog .modal-dialog-button-box .modal-dialog-button:active:focus {
- .conflicting-session-dialog-content .conflicting-session-dialog-title, .message-dialog-content .message-dialog-title, .message-list .message-list-placeholder, .datemenu-today-button .date-label {
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.16), #ffffff, 87%), 5%); }
 +  .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), #ffffff, 87%); }
 +    .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked:hover {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 4%); }
 +    .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked:active {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 9%); }
 +  .modal-dialog .modal-dialog-button-box .modal-dialog-button:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: st-transparentize(#ffffff, 0.5);
 +    background-color: st-darken(st-mix(#ffffff, #1a1a1a, 9%), 3%);
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none; }
 +
 +.dash-label, .window-caption, .screenshot-ui-tooltip {
 +  background-color: rgba(0, 0, 0, 0.9);
 +  border: 1px solid rgba(255, 255, 255, 0.1);
 +  color: #ffffff;
 +  border-radius: 999px;
 +  padding: 6px 12px;
 +  text-align: center;
 +  background-color: black;
 +  border-color: rgba(255, 255, 255, 0.4); }
 +
 +/* General Typography */
 +.unlock-dialog-clock .unlock-dialog-clock-date, .app-folder-dialog .folder-name-container .folder-name-label, .app-folder-dialog .folder-name-container .folder-name-entry, .search-statustext {
 +  font-weight: 800;
 +  font-size: 1.818em; }
 +
- .unlock-dialog .user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title {
++.conflicting-session-dialog-content .conflicting-session-dialog-title, .message-dialog-content .message-dialog-title, .datemenu-today-button .date-label {
 +  font-weight: 800;
 +  font-size: 1.364em; }
 +
 +.login-dialog .user-widget.horizontal .user-widget-label,
- .login-dialog-not-listed-label, #LookingGlassExtensions .lg-extension .lg-extension-name, #LookingGlassWindows .lg-window .lg-window-name, #LookingGlassPropertyInspector .lg-obj-inspector-title, .background-app-item .title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-box .weather-header-box .weather-header, .world-clocks-button .world-clocks-header, .events-button .events-box .events-list .event-box .event-summary, .events-button .events-box .events-title, .calendar .calendar-month-header .calendar-month-label {
++.unlock-dialog .user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title, .message-list .message-list-placeholder {
 +  font-weight: 700;
 +  font-size: 1.364em; }
 +
 +.login-dialog-auth-list-label, #LookingGlassDebugFlags .lg-debug-flags-header, #LookingGlassExtensions .lg-extensions-none, .word-suggestions, .bt-menu-placeholder.popup-menu-item, .restart-message, .polkit-dialog-user-layout .polkit-dialog-user-label,
 +.polkit-dialog-user-layout .polkit-dialog-user-root-label, .message-dialog-content .message-dialog-title.lightweight {
 +  font-weight: 700;
 +  font-size: 1.182em; }
 +
- .lg-completions-text, .caps-lock-warning-label, .background-app-item .subtitle, .quick-toggle StBoxLayout > .quick-toggle-subtitle, .screenshot-ui-type-button .icon-label-button-container, .prompt-dialog .prompt-dialog-error-label,
++.login-dialog-not-listed-label, #LookingGlassExtensions .lg-extension .lg-extension-name, #LookingGlassWindows .lg-window .lg-window-name, #LookingGlassPropertyInspector .lg-obj-inspector-title, .background-app-item .title, .quick-toggle .quick-toggle-title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-box .weather-header-box .weather-header, .world-clocks-button .world-clocks-header, .events-button .events-box .events-list .event-box .event-summary, .events-button .events-box .events-title, .calendar .calendar-month-header .calendar-month-label {
 +  font-weight: 700;
 +  font-size: 1em; }
 +
 +.quick-toggle-menu .header .subtitle, .app-menu .popup-inactive-menu-item:first-child > StLabel {
 +  font-weight: 700;
 +  font-size: 0.818em; }
 +
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, #171717, 5%);
++.lg-completions-text, .caps-lock-warning-label, .background-app-item .subtitle, .quick-toggle .quick-toggle-subtitle, .screenshot-ui-type-button .icon-label-button-container, .prompt-dialog .prompt-dialog-error-label,
 +.prompt-dialog .prompt-dialog-info-label,
 +.prompt-dialog .prompt-dialog-null-label, .run-dialog .run-dialog-description, .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description, .message .message-header .message-header-content .event-time, .world-clocks-button .world-clocks-grid .world-clocks-timezone, .events-button .events-box .events-list .event-box .event-time {
 +  font-weight: 400;
 +  font-size: 0.818em; }
 +
 +.weather-button .weather-box .weather-grid .weather-forecast-time, .calendar .calendar-week-number, .calendar .calendar-day-heading, .calendar .calendar-day {
 +  font-weight: 400;
 +  font-size: 0.818em; }
 +
 +#LookingGlassDebugFlags .lg-debug-flag-button StLabel, #LookingGlassEvaluator .evaluator-results, .lg-dialog .actor-link {
 +  font-family: monospace; }
 +
 +.unlock-dialog-clock .unlock-dialog-clock-time, #panel, .weather-button .weather-box .weather-grid .weather-forecast-temp, .world-clocks-button .world-clocks-grid .world-clocks-timezone, .world-clocks-button .world-clocks-grid .world-clocks-time, .events-button .events-box .events-list .event-box .event-time, .calendar .calendar-day-heading, .calendar .calendar-day {
 +  font-feature-settings: "tnum"; }
 +
 +/* OSD Elements */
 +#LookingGlassDialog, .screenshot-ui-panel, .workspace-switcher, .switcher-list, .resize-popup, .osd-window {
 +  color: #ffffff;
 +  background-color: #000000;
 +  border: 1px solid rgba(255, 255, 255, 0.2);
 +  border-radius: 999px;
 +  padding: 12px;
 +  box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.4);
 +  border: 2px solid rgba(255, 255, 255, 0.4);
 +  box-shadow: none; }
 +
 +.lg-dialog StEntry {
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  background-color: #171717;
 +  color: rgba(255, 255, 255, 0.7); }
 +  .lg-dialog StEntry:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    background-color: #212121;
 +    color: #ffffff; }
 +  .lg-dialog StEntry:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #171717, 5%);
 +    color: #ffffff; }
 +  .lg-dialog StEntry:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    background-color: #0f0f0f;
 +    color: rgba(255, 255, 255, 0.5); }
 +  .lg-dialog StEntry StLabel.hint-text {
 +    color: rgba(255, 255, 255, 0.7); }
 +
 +#LookingGlassDebugFlags .lg-debug-flag-button, #LookingGlassPropertyInspector .lg-obj-inspector-close-button,
 +#LookingGlassPropertyInspector .lg-obj-inspector-button, #LookingGlassDialog > #Toolbar .lg-toolbar-button {
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  color: #ffffff;
 +  background-color: st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%); }
 +  #LookingGlassDebugFlags .lg-debug-flag-button:focus, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:focus,
 +  #LookingGlassPropertyInspector .lg-obj-inspector-button:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%), 5%); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button:focus:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:focus:hover,
 +    #LookingGlassPropertyInspector .lg-obj-inspector-button:focus:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus:hover {
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%), 5%); }
 +  #LookingGlassDebugFlags .lg-debug-flag-button:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:hover,
 +  #LookingGlassPropertyInspector .lg-obj-inspector-button:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%); }
 +  #LookingGlassDebugFlags .lg-debug-flag-button:active, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active,
 +  #LookingGlassPropertyInspector .lg-obj-inspector-button:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button:active:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active:hover,
 +    #LookingGlassPropertyInspector .lg-obj-inspector-button:active:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active:hover {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), 4%); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button:active:focus, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active:focus,
 +    #LookingGlassPropertyInspector .lg-obj-inspector-button:active:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active:focus {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, rgba(0, 0, 0, 0.25), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); }
 +  #LookingGlassDebugFlags .lg-debug-flag-button:checked, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked,
 +  #LookingGlassPropertyInspector .lg-obj-inspector-button:checked, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 8%), #ffffff, 87%); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button:checked:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked:hover,
 +    #LookingGlassPropertyInspector .lg-obj-inspector-button:checked:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:hover {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 8%), 4%); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button:checked:active, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked:active,
 +    #LookingGlassPropertyInspector .lg-obj-inspector-button:checked:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:active {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 8%), 9%); }
 +  #LookingGlassDebugFlags .lg-debug-flag-button:insensitive, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:insensitive,
 +  #LookingGlassPropertyInspector .lg-obj-inspector-button:insensitive, #LookingGlassDialog > #Toolbar .lg-toolbar-button:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: st-transparentize(#ffffff, 0.5);
 +    background-color: st-darken(st-mix(#ffffff, #000000, 9%), 3%);
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none; }
 +
 +#LookingGlassDialog .notebook-tab, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button {
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  color: #ffffff;
 +  background-color: #000000;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  box-shadow: none;
 +  border: none; }
 +  #LookingGlassDialog .notebook-tab:focus, .screenshot-ui-show-pointer-button:focus, .screenshot-ui-type-button:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(0, 0, 0, 0.25), 5%); }
 +    #LookingGlassDialog .notebook-tab:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .screenshot-ui-type-button:focus:hover {
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
 +  #LookingGlassDialog .notebook-tab:hover, .screenshot-ui-show-pointer-button:hover, .screenshot-ui-type-button:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#000000, 7%), #ffffff, 87%); }
 +  #LookingGlassDialog .notebook-tab:active, .screenshot-ui-show-pointer-button:active, .screenshot-ui-type-button:active {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#000000, 9%), #ffffff, 87%); }
 +    #LookingGlassDialog .notebook-tab:active:hover, .screenshot-ui-show-pointer-button:active:hover, .screenshot-ui-type-button:active:hover {
 +      background-color: st-lighten(st-lighten(#000000, 9%), 7%); }
 +    #LookingGlassDialog .notebook-tab:active:focus, .screenshot-ui-show-pointer-button:active:focus, .screenshot-ui-type-button:active:focus {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, #232323, 5%);
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
 +  #LookingGlassDialog .notebook-tab:checked, .screenshot-ui-show-pointer-button:checked, .screenshot-ui-type-button:checked {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#000000, 8%), #ffffff, 87%); }
 +    #LookingGlassDialog .notebook-tab:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .screenshot-ui-type-button:checked:hover {
 +      background-color: st-lighten(st-lighten(#000000, 8%), 7%); }
 +    #LookingGlassDialog .notebook-tab:checked:active, .screenshot-ui-show-pointer-button:checked:active, .screenshot-ui-type-button:checked:active {
 +      background-color: st-lighten(st-lighten(#000000, 8%), 9%); }
 +  #LookingGlassDialog .notebook-tab:insensitive, .screenshot-ui-show-pointer-button:insensitive, .screenshot-ui-type-button:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: st-transparentize(#ffffff, 0.5);
 +    background-color: #000000;
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none; }
 +
 +/* System Elements */
 +.login-dialog .login-dialog-prompt-entry, .app-folder-dialog .folder-name-container .folder-name-entry, .search-entry {
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  background-color: #232323;
 +  color: rgba(255, 255, 255, 0.7); }
 +  .login-dialog .login-dialog-prompt-entry:hover, .app-folder-dialog .folder-name-container .folder-name-entry:hover, .search-entry:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    background-color: #2d2d2d;
 +    color: #ffffff; }
 +  .login-dialog .login-dialog-prompt-entry:focus, .app-folder-dialog .folder-name-container .folder-name-entry:focus, .search-entry:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #0d0d0d, 9%), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #232323, 5%);
 +    color: #ffffff; }
 +  .login-dialog .login-dialog-prompt-entry:insensitive, .app-folder-dialog .folder-name-container .folder-name-entry:insensitive, .search-entry:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    background-color: #1b1b1b;
 +    color: rgba(255, 255, 255, 0.5); }
 +  .login-dialog .login-dialog-prompt-entry StLabel.hint-text, .app-folder-dialog .folder-name-container .folder-name-entry StLabel.hint-text, .search-entry StLabel.hint-text {
 +    color: rgba(255, 255, 255, 0.7); }
 +
 +.login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button {
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  color: #ffffff;
 +  background-color: st-mix(st-mix(#ffffff, #0d0d0d, 9%), #ffffff, 87%); }
 +  .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: st-transparentize(#ffffff, 0.5);
 +    background-color: st-darken(st-mix(#ffffff, #0d0d0d, 9%), 3%);
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none; }
 +  .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 4%), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #0d0d0d, 9%), #ffffff, 87%), 5%); }
 +    .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover {
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 9%), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 4%), #ffffff, 87%), 5%); }
 +  .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 4%), #ffffff, 87%); }
 +  .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 9%), #ffffff, 87%); }
 +    .login-dialog-button.cancel-button:active:hover, .login-dialog-button.switch-user-button:active:hover, .login-dialog-button.login-dialog-session-list-button:active:hover {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 9%), 4%); }
 +    .login-dialog-button.cancel-button:active:focus, .login-dialog-button.switch-user-button:active:focus, .login-dialog-button.login-dialog-session-list-button:active:focus {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.1), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 9%), #ffffff, 87%), 5%); }
 +  .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 8%), #ffffff, 87%); }
 +    .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 8%), 4%); }
 +    .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 8%), 9%); }
 +
 +/* Lockscreen Elements */
 +.unlock-dialog .button,
 +.unlock-dialog .icon-button,
 +.unlock-dialog .calendar .calendar-month-header .pager-button,
 +.calendar .calendar-month-header .unlock-dialog .pager-button,
 +.unlock-dialog .message .message-header .message-expand-button,
 +.message .message-header .unlock-dialog .message-expand-button,
 +.unlock-dialog .message .message-header .message-close-button,
 +.message .message-header .unlock-dialog .message-close-button,
 +.unlock-dialog .screenshot-ui-show-pointer-button,
 +.unlock-dialog .login-dialog-button.cancel-button,
 +.unlock-dialog .login-dialog-button.switch-user-button,
 +.unlock-dialog .login-dialog-button.login-dialog-session-list-button {
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  color: #ffffff;
 +  background-color: st-mix(rgba(255, 255, 255, 0.1), #ffffff, 87%); }
 +  .unlock-dialog .button:focus,
 +  .unlock-dialog .icon-button:focus,
 +  .unlock-dialog .calendar .calendar-month-header .pager-button:focus,
 +  .calendar .calendar-month-header .unlock-dialog .pager-button:focus,
 +  .unlock-dialog .message .message-header .message-expand-button:focus,
 +  .message .message-header .unlock-dialog .message-expand-button:focus,
 +  .unlock-dialog .message .message-header .message-close-button:focus,
 +  .message .message-header .unlock-dialog .message-close-button:focus,
 +  .unlock-dialog .screenshot-ui-show-pointer-button:focus,
 +  .unlock-dialog .login-dialog-button.cancel-button:focus,
 +  .unlock-dialog .login-dialog-button.switch-user-button:focus,
 +  .unlock-dialog .login-dialog-button.login-dialog-session-list-button:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.13), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.1), #ffffff, 87%), 5%); }
 +    .unlock-dialog .button:focus:hover,
 +    .unlock-dialog .icon-button:focus:hover,
 +    .unlock-dialog .calendar .calendar-month-header .pager-button:focus:hover,
 +    .calendar .calendar-month-header .unlock-dialog .pager-button:focus:hover,
 +    .unlock-dialog .message .message-header .message-expand-button:focus:hover,
 +    .message .message-header .unlock-dialog .message-expand-button:focus:hover,
 +    .unlock-dialog .message .message-header .message-close-button:focus:hover,
 +    .message .message-header .unlock-dialog .message-close-button:focus:hover,
 +    .unlock-dialog .screenshot-ui-show-pointer-button:focus:hover,
 +    .unlock-dialog .login-dialog-button.cancel-button:focus:hover,
 +    .unlock-dialog .login-dialog-button.switch-user-button:focus:hover,
 +    .unlock-dialog .login-dialog-button.login-dialog-session-list-button:focus:hover {
-       background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.16), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.13), #ffffff, 87%), 5%); }
 +  .unlock-dialog .button:hover,
 +  .unlock-dialog .icon-button:hover,
 +  .unlock-dialog .calendar .calendar-month-header .pager-button:hover,
 +  .calendar .calendar-month-header .unlock-dialog .pager-button:hover,
 +  .unlock-dialog .message .message-header .message-expand-button:hover,
 +  .message .message-header .unlock-dialog .message-expand-button:hover,
 +  .unlock-dialog .message .message-header .message-close-button:hover,
 +  .message .message-header .unlock-dialog .message-close-button:hover,
 +  .unlock-dialog .screenshot-ui-show-pointer-button:hover,
 +  .unlock-dialog .login-dialog-button.cancel-button:hover,
 +  .unlock-dialog .login-dialog-button.switch-user-button:hover,
 +  .unlock-dialog .login-dialog-button.login-dialog-session-list-button:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(rgba(255, 255, 255, 0.13), #ffffff, 87%); }
 +  .unlock-dialog .button:active,
 +  .unlock-dialog .icon-button:active,
 +  .unlock-dialog .calendar .calendar-month-header .pager-button:active,
 +  .calendar .calendar-month-header .unlock-dialog .pager-button:active,
 +  .unlock-dialog .message .message-header .message-expand-button:active,
 +  .message .message-header .unlock-dialog .message-expand-button:active,
 +  .unlock-dialog .message .message-header .message-close-button:active,
 +  .message .message-header .unlock-dialog .message-close-button:active,
 +  .unlock-dialog .screenshot-ui-show-pointer-button:active,
 +  .unlock-dialog .login-dialog-button.cancel-button:active,
 +  .unlock-dialog .login-dialog-button.switch-user-button:active,
 +  .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(rgba(255, 255, 255, 0.16), #ffffff, 87%); }
 +    .unlock-dialog .button:active:hover,
 +    .unlock-dialog .icon-button:active:hover,
 +    .unlock-dialog .calendar .calendar-month-header .pager-button:active:hover,
 +    .calendar .calendar-month-header .unlock-dialog .pager-button:active:hover,
 +    .unlock-dialog .message .message-header .message-expand-button:active:hover,
 +    .message .message-header .unlock-dialog .message-expand-button:active:hover,
 +    .unlock-dialog .message .message-header .message-close-button:active:hover,
 +    .message .message-header .unlock-dialog .message-close-button:active:hover,
 +    .unlock-dialog .screenshot-ui-show-pointer-button:active:hover,
 +    .unlock-dialog .login-dialog-button.cancel-button:active:hover,
 +    .unlock-dialog .login-dialog-button.switch-user-button:active:hover,
 +    .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active:hover {
 +      background-color: rgba(255, 255, 255, 0.19); }
 +    .unlock-dialog .button:active:focus,
 +    .unlock-dialog .icon-button:active:focus,
 +    .unlock-dialog .calendar .calendar-month-header .pager-button:active:focus,
 +    .calendar .calendar-month-header .unlock-dialog .pager-button:active:focus,
 +    .unlock-dialog .message .message-header .message-expand-button:active:focus,
 +    .message .message-header .unlock-dialog .message-expand-button:active:focus,
 +    .unlock-dialog .message .message-header .message-close-button:active:focus,
 +    .message .message-header .unlock-dialog .message-close-button:active:focus,
 +    .unlock-dialog .screenshot-ui-show-pointer-button:active:focus,
 +    .unlock-dialog .login-dialog-button.cancel-button:active:focus,
 +    .unlock-dialog .login-dialog-button.switch-user-button:active:focus,
 +    .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active:focus {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.1), 5%);
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.16), #ffffff, 87%), 5%); }
 +  .unlock-dialog .button:checked,
 +  .unlock-dialog .icon-button:checked,
 +  .unlock-dialog .calendar .calendar-month-header .pager-button:checked,
 +  .calendar .calendar-month-header .unlock-dialog .pager-button:checked,
 +  .unlock-dialog .message .message-header .message-expand-button:checked,
 +  .message .message-header .unlock-dialog .message-expand-button:checked,
 +  .unlock-dialog .message .message-header .message-close-button:checked,
 +  .message .message-header .unlock-dialog .message-close-button:checked,
 +  .unlock-dialog .screenshot-ui-show-pointer-button:checked,
 +  .unlock-dialog .login-dialog-button.cancel-button:checked,
 +  .unlock-dialog .login-dialog-button.switch-user-button:checked,
 +  .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), #ffffff, 87%); }
 +    .unlock-dialog .button:checked:hover,
 +    .unlock-dialog .icon-button:checked:hover,
 +    .unlock-dialog .calendar .calendar-month-header .pager-button:checked:hover,
 +    .calendar .calendar-month-header .unlock-dialog .pager-button:checked:hover,
 +    .unlock-dialog .message .message-header .message-expand-button:checked:hover,
 +    .message .message-header .unlock-dialog .message-expand-button:checked:hover,
 +    .unlock-dialog .message .message-header .message-close-button:checked:hover,
 +    .message .message-header .unlock-dialog .message-close-button:checked:hover,
 +    .unlock-dialog .screenshot-ui-show-pointer-button:checked:hover,
 +    .unlock-dialog .login-dialog-button.cancel-button:checked:hover,
 +    .unlock-dialog .login-dialog-button.switch-user-button:checked:hover,
 +    .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked:hover {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 4%); }
 +    .unlock-dialog .button:checked:active,
 +    .unlock-dialog .icon-button:checked:active,
 +    .unlock-dialog .calendar .calendar-month-header .pager-button:checked:active,
 +    .calendar .calendar-month-header .unlock-dialog .pager-button:checked:active,
 +    .unlock-dialog .message .message-header .message-expand-button:checked:active,
 +    .message .message-header .unlock-dialog .message-expand-button:checked:active,
 +    .unlock-dialog .message .message-header .message-close-button:checked:active,
 +    .message .message-header .unlock-dialog .message-close-button:checked:active,
 +    .unlock-dialog .screenshot-ui-show-pointer-button:checked:active,
 +    .unlock-dialog .login-dialog-button.cancel-button:checked:active,
 +    .unlock-dialog .login-dialog-button.switch-user-button:checked:active,
 +    .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked:active {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 9%); }
 +  .unlock-dialog .button:insensitive,
 +  .unlock-dialog .icon-button:insensitive,
 +  .unlock-dialog .calendar .calendar-month-header .pager-button:insensitive,
 +  .calendar .calendar-month-header .unlock-dialog .pager-button:insensitive,
 +  .unlock-dialog .message .message-header .message-expand-button:insensitive,
 +  .message .message-header .unlock-dialog .message-expand-button:insensitive,
 +  .unlock-dialog .message .message-header .message-close-button:insensitive,
 +  .message .message-header .unlock-dialog .message-close-button:insensitive,
 +  .unlock-dialog .screenshot-ui-show-pointer-button:insensitive,
 +  .unlock-dialog .login-dialog-button.cancel-button:insensitive,
 +  .unlock-dialog .login-dialog-button.switch-user-button:insensitive,
 +  .unlock-dialog .login-dialog-button.login-dialog-session-list-button:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: st-transparentize(#ffffff, 0.5);
 +    background-color: st-darken(st-mix(#ffffff, #1a1a1a, 9%), 3%);
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none; }
 +
 +.unlock-dialog .login-dialog-prompt-entry {
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  background-color: rgba(255, 255, 255, 0.1);
 +  color: rgba(255, 255, 255, 0.7); }
 +  .unlock-dialog .login-dialog-prompt-entry:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    background-color: rgba(255, 255, 255, 0.1);
 +    color: #ffffff; }
 +  .unlock-dialog .login-dialog-prompt-entry:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
-     box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.7) !important;
++    box-shadow: inset 0 0 0 2px st-transparentize(rgba(255, 255, 255, 0.7), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.1), 5%);
 +    color: #ffffff;
-   warning-color: #f6d32d;
++    box-shadow: inset 0 0 0 2px st-transparentize(rgba(255, 255, 255, 0.7), 0.1) !important;
 +    background-color: st-mix(rgba(255, 255, 255, 0.7), rgba(255, 255, 255, 0.1), 5%); }
 +  .unlock-dialog .login-dialog-prompt-entry:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    background-color: rgba(247, 247, 247, 0.1);
 +    color: rgba(255, 255, 255, 0.5); }
 +  .unlock-dialog .login-dialog-prompt-entry StLabel.hint-text {
 +    color: rgba(255, 255, 255, 0.7); }
 +
 +/* WIDGETS */
 +.shell-link {
 +  color: st-lighten(-st-accent-color, 20%); }
 +  .shell-link:hover {
 +    color: st-lighten(st-lighten(-st-accent-color, 20%), 10%); }
 +
 +.lowres-icon {
 +  icon-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); }
 +
 +.icon-dropshadow {
 +  icon-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
 +  icon-shadow: none; }
 +
 +/* Entries */
 +StEntry StIcon.capslock-warning {
 +  icon-size: 1.091em;
-   .popup-menu-item:hover {
-     box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
-     color: #ffffff;
-     background-color: st-mix(st-lighten(st-mix(#ffffff, #262626, 9%), 4%), #ffffff, 87%); }
++  warning-color: #cd9309;
 +  padding: 0 4px; }
 +
 +StEntry StIcon.peek-password {
 +  icon-size: 1.091em;
 +  padding: 0 4px; }
 +
 +StEntry StLabel.hint-text {
 +  margin-left: 2px; }
 +
 +/* Buttons */
 +.button {
 +  min-height: 1.5em; }
 +
 +.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .screenshot-ui-show-pointer-button, .message .message-header .message-expand-button,
 +.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button {
 +  border-radius: 999px;
 +  padding: 0.818em;
 +  min-height: 1.091em; }
 +  .icon-button StIcon, .login-dialog-button.cancel-button StIcon, .login-dialog-button.switch-user-button StIcon, .login-dialog-button.login-dialog-session-list-button StIcon, .screenshot-ui-show-pointer-button StIcon, .message .message-header .message-expand-button StIcon,
 +  .message .message-header .message-close-button StIcon, .calendar .calendar-month-header .pager-button StIcon {
 +    icon-size: 1.091em;
 +    -st-icon-style: symbolic; }
 +
 +/* Check Boxes */
 +.check-box StBoxLayout {
 +  spacing: .8em; }
 +
 +.check-box StBin {
 +  border-radius: 7px;
 +  padding: 2px; }
 +
 +.check-box:focus StBin {
 +  background-color: rgba(0, 0, 0, 0.01);
 +  box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.65); }
 +
 +.check-box StIcon {
 +  icon-size: 14px;
 +  padding: 1px;
 +  color: transparent;
 +  border-radius: 6px;
 +  border: 2px solid rgba(255, 255, 255, 0.15); }
 +
 +.check-box:hover StIcon {
 +  border-color: rgba(255, 255, 255, 0.2); }
 +
 +.check-box:active StIcon {
 +  border-color: rgba(255, 255, 255, 0.3); }
 +
 +.check-box:checked StIcon {
 +  background-color: -st-accent-color;
 +  color: -st-accent-fg-color;
 +  border-color: transparent; }
 +
 +.check-box:checked:hover StIcon {
 +  background-color: st-lighten(-st-accent-color, 5%);
 +  color: st-lighten(-st-accent-fg-color, 5%); }
 +
 +.check-box:checked:active StIcon {
 +  background-color: st-darken(-st-accent-color, 7%);
 +  color: st-darken(-st-accent-fg-color, 7%); }
 +
 +/* Switches */
 +.toggle-switch {
 +  width: 46px;
 +  border-radius: 999px;
 +  transition-duration: 100ms;
 +  color: #ffffff;
 +  background: rgba(255, 255, 255, 0.3); }
 +  .toggle-switch:hover {
 +    background: rgba(255, 255, 255, 0.4); }
 +  .toggle-switch StIcon {
 +    icon-size: 16px; }
 +  .toggle-switch .handle {
 +    margin: 3px;
 +    width: 20px;
 +    height: 20px;
 +    border-radius: 999px;
 +    background: #d1d1d1;
 +    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
 +    transition-duration: 100ms; }
 +  .toggle-switch:checked {
 +    background: -st-accent-color;
 +    color: -st-accent-fg-color; }
 +    .toggle-switch:checked:hover {
 +      background-color: st-lighten(-st-accent-color, 5%);
 +      color: st-lighten(-st-accent-fg-color, 5%); }
 +    .toggle-switch:checked .handle {
 +      background: white; }
 +
 +/* Slider */
 +.slider {
 +  color: #e8e8e8;
 +  -barlevel-height: 4px;
 +  -barlevel-background-color: rgba(255, 255, 255, 0.1);
 +  -barlevel-active-background-color: -st-accent-color;
 +  -barlevel-overdrive-color: #c01c28;
 +  -barlevel-overdrive-separator-width: 1px;
 +  -slider-handle-radius: 0.5455em;
 +  -barlevel-background-color: rgba(255, 255, 255, 0.4); }
 +  .slider:hover {
 +    color: #ffffff; }
 +
 +/* Scrollbars */
 +StScrollView.vfade {
 +  -st-vfade-offset: 68px; }
 +
 +StScrollView.hfade {
 +  -st-hfade-offset: 68px; }
 +
 +StScrollBar {
 +  padding: 0; }
 +  StScrollView StScrollBar {
 +    min-width: 8px;
 +    min-height: 8px; }
 +  StScrollBar StBin#trough {
 +    border-radius: 0;
 +    background-color: transparent; }
 +  StScrollBar StButton#vhandle, StScrollBar StButton#hhandle {
 +    border-radius: 8px;
 +    background-color: #5e5e5e;
 +    border: 3px solid transparent;
 +    transition: 500ms all ease; }
 +    StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover {
 +      background-color: #8c8c8c; }
 +    StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active {
 +      background-color: #757575; }
 +
 +/* Popovers/Menus */
 +.popup-menu-boxpointer, .candidate-popup-boxpointer {
 +  -arrow-rise: 6px; }
 +
 +.popup-menu {
 +  min-width: 15em;
 +  color: #ffffff; }
 +  .popup-menu.panel-menu {
 +    margin-bottom: 1.75em; }
 +
 +.popup-menu-content, .candidate-popup-content {
 +  padding: 6px;
 +  background-color: #1a1a1a;
 +  border-radius: 20px;
 +  border: 1px solid rgba(255, 255, 255, 0.5);
 +  box-shadow: 0 2px 4px 0 transparent; }
 +
 +.popup-menu-item {
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  background-color: transparent;
 +  border-color: transparent;
 +  box-shadow: none;
 +  border-radius: 12px; }
 +  .popup-menu-item:insensitive {
 +    background-color: transparent !important; }
-     background-color: st-mix(st-lighten(st-mix(#ffffff, #262626, 9%), 9%), #ffffff, 87%); }
 +  .popup-menu-item:active {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #262626, 9%), 9%), 4%); }
++    background-color: st-mix(st-lighten(#262626, 9%), #ffffff, 87%); }
 +    .popup-menu-item:active:hover {
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #262626, 9%), 9%), #ffffff, 87%), 5%); }
-   .popup-menu-item:selected, .popup-menu-item:checked {
++      background-color: st-lighten(st-lighten(#262626, 9%), 7%); }
 +    .popup-menu-item:active:focus {
-     background-color: st-mix(st-lighten(st-mix(#ffffff, #262626, 9%), 8%), #ffffff, 87%); }
-     .popup-menu-item:selected:hover, .popup-menu-item:checked:hover {
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #262626, 9%), 8%), 4%); }
-     .popup-menu-item:selected:active, .popup-menu-item:checked:active {
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #262626, 9%), 8%), 9%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#262626, 9%), #ffffff, 87%), 5%); }
++  .popup-menu-item:hover, .popup-menu-item:selected, .popup-menu-item:checked {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
-     background-color: st-darken(st-mix(#ffffff, #262626, 9%), 3%);
++    background-color: st-mix(st-lighten(#262626, 7%), #ffffff, 87%); }
 +  .popup-menu-item:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: st-transparentize(#ffffff, 0.5);
-     .popup-sub-menu .popup-menu-item:hover {
-       box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
-       color: #ffffff;
-       background-color: st-mix(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 4%), #ffffff, 87%); }
++    background-color: #262626;
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none; }
 +  .popup-menu-item:checked {
 +    border-radius: 12px 12px 0 0 !important;
 +    border: 1px solid rgba(255, 255, 255, 0.4);
 +    border-bottom-width: 0; }
 +  .popup-menu-item .toggle-switch:ltr {
 +    margin-left: 4px; }
 +  .popup-menu-item .toggle-switch:rtl {
 +    margin-right: 4px; }
 +
 +.popup-ornamented-menu-item:ltr {
 +  padding-left: 6px; }
 +
 +.popup-ornamented-menu-item:rtl {
 +  padding-right: 6px; }
 +
 +.popup-inactive-menu-item {
 +  color: #ffffff; }
 +  .popup-inactive-menu-item:insensitive {
 +    color: #ffffff; }
 +
 +.popup-menu-arrow,
 +.popup-menu-icon {
 +  icon-size: 1.091em; }
 +
 +.popup-sub-menu {
 +  border-radius: 0 0 13px 13px;
 +  margin-bottom: 6px;
 +  border: 1px solid transparent;
 +  background-color: #3b3b3b;
 +  border-color: rgba(255, 255, 255, 0.4); }
 +  .popup-sub-menu .popup-menu-item {
 +    border-radius: 0;
 +    border-top-width: 0;
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    background-color: transparent;
 +    border-color: transparent;
 +    box-shadow: none; }
 +    .popup-sub-menu .popup-menu-item:insensitive {
 +      background-color: transparent !important; }
-       background-color: st-mix(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 9%), #ffffff, 87%); }
 +    .popup-sub-menu .popup-menu-item:active {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
-         background-color: st-lighten(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 9%), 4%); }
++      background-color: st-mix(st-lighten(#3b3b3b, 9%), #ffffff, 87%); }
 +      .popup-sub-menu .popup-menu-item:active:hover {
-         background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 9%), #ffffff, 87%), 5%); }
-     .popup-sub-menu .popup-menu-item:selected, .popup-sub-menu .popup-menu-item:checked {
++        background-color: st-lighten(st-lighten(#3b3b3b, 9%), 7%); }
 +      .popup-sub-menu .popup-menu-item:active:focus {
-       background-color: st-mix(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 8%), #ffffff, 87%); }
-       .popup-sub-menu .popup-menu-item:selected:hover, .popup-sub-menu .popup-menu-item:checked:hover {
-         background-color: st-lighten(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 8%), 4%); }
-       .popup-sub-menu .popup-menu-item:selected:active, .popup-sub-menu .popup-menu-item:checked:active {
-         background-color: st-lighten(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 8%), 9%); }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#3b3b3b, 9%), #ffffff, 87%), 5%); }
++    .popup-sub-menu .popup-menu-item:hover, .popup-sub-menu .popup-menu-item:selected, .popup-sub-menu .popup-menu-item:checked {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
-       background-color: st-darken(st-mix(#ffffff, #3b3b3b, 9%), 3%);
++      background-color: st-mix(st-lighten(#3b3b3b, 7%), #ffffff, 87%); }
 +    .popup-sub-menu .popup-menu-item:insensitive {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: st-transparentize(#ffffff, 0.5);
-     color: rgba(255, 255, 255, 0.25);
-     color: rgba(255, 255, 255, 0.5); }
++      background-color: #3b3b3b;
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      box-shadow: none;
 +      border: none; }
 +    .popup-sub-menu .popup-menu-item:last-child {
 +      border-radius: 0 0 12px 12px;
 +      border-bottom-width: 0; }
 +  .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:hover, .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:focus {
 +    border-radius: 0; }
 +  .popup-sub-menu .popup-menu-section:last-child .popup-menu-item:last-child {
 +    border-radius: 0 0 12px 12px; }
 +
 +.popup-menu-ornament {
 +  icon-size: 1.091em !important;
 +  width: 1.091em; }
 +
 +.popup-separator-menu-item {
 +  border: none !important; }
 +  .popup-separator-menu-item .popup-separator-menu-item-separator {
 +    height: 1px;
 +    background-color: rgba(255, 255, 255, 0.5); }
 +  .popup-sub-menu .popup-separator-menu-item {
 +    background-color: transparent; }
 +    .popup-sub-menu .popup-separator-menu-item:ltr {
 +      margin-right: 2.5em; }
 +    .popup-sub-menu .popup-separator-menu-item:rtl {
 +      margin-left: 2.5em; }
 +    .popup-sub-menu .popup-separator-menu-item .popup-separator-menu-item-separator {
 +      background-color: rgba(255, 255, 255, 0.5); }
 +
 +.background-menu {
 +  -boxpointer-gap: 0px;
 +  -arrow-rise: 0px; }
 +
 +.app-menu {
 +  max-width: 27.25em; }
 +  .app-menu .popup-inactive-menu-item:first-child > StLabel:ltr {
 +    margin-right: 8px; }
 +  .app-menu .popup-inactive-menu-item:first-child > StLabel:rtl {
 +    margin-left: 8px; }
 +
 +/* Date/Time Menu */
 +#calendarArea {
 +  padding: 4px; }
 +
 +.datemenu-popover {
 +  border-radius: 30px; }
 +
 +.datemenu-calendar-column {
 +  spacing: 6px; }
 +  .datemenu-calendar-column:ltr {
 +    margin-left: 6px; }
 +  .datemenu-calendar-column:rtl {
 +    margin-right: 6px; }
 +  .datemenu-calendar-column .datemenu-displays-box {
 +    spacing: 6px; }
 +
 +.datemenu-today-button {
 +  padding: 9px; }
 +  .datemenu-today-button .day-label {
 +    font-weight: bold; }
 +
 +.calendar {
 +  margin-top: 0;
 +  padding: 0; }
 +  .calendar .calendar-month-header .calendar-change-month-back StIcon,
 +  .calendar .calendar-month-header .calendar-change-month-forward StIcon {
 +    icon-size: 1.091em; }
 +  .calendar .calendar-month-header .calendar-month-label {
 +    color: #ffffff !important;
 +    padding: 8px 0;
 +    width: 10em;
 +    border-radius: 999px;
 +    text-align: center; }
 +  .calendar .calendar-month-header .pager-button {
 +    height: 2.6em;
 +    width: 2.6em;
 +    padding: 0; }
 +  .calendar .calendar-day {
 +    border-radius: 999px;
 +    height: 3em;
 +    width: 3em;
 +    margin: 2px;
 +    padding: 0;
 +    font-weight: bold;
 +    text-align: center; }
 +    .calendar .calendar-day.calendar-weekend {
 +      color: #ffffff;
 +      font-style: italic; }
 +    .calendar .calendar-day.calendar-other-month {
 +      color: rgba(255, 255, 255, 0.5);
 +      font-weight: normal;
 +      color: #ffffff;
 +      font-style: italic; }
 +      .calendar .calendar-day.calendar-other-month.calendar-weekend {
 +        color: rgba(255, 255, 255, 0.5);
 +        color: #ffffff; }
 +    .calendar .calendar-day.calendar-today {
 +      color: -st-accent-fg-color !important; }
 +      .calendar .calendar-day.calendar-today.calendar-day-with-events {
 +        background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg") !important; }
 +    .calendar .calendar-day.calendar-day-with-events {
 +      background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg");
 +      background-size: contain; }
 +  .calendar .calendar-day-heading {
 +    font-weight: bold;
 +    text-align: center;
 +    margin: 4px;
 +    padding: 3px 6px;
 +    border-radius: 8px; }
 +  .calendar .calendar-week-number {
 +    font-weight: bold;
 +    font-feature-settings: "tnum";
 +    text-align: center;
 +    margin: 6px;
 +    padding: 0 6px;
 +    border-radius: 4px;
 +    background-color: rgba(255, 255, 255, 0.2);
 +    color: #ffffff; }
 +
 +.events-button .events-box .events-title {
 +  color: #ffffff;
 +  padding-bottom: 6px; }
 +
 +.events-button .events-box .events-list {
 +  spacing: 6px; }
 +  .events-button .events-box .events-list .event-box {
 +    spacing: 6px;
 +    border-radius: 8px; }
 +    .events-button .events-box .events-list .event-box .event-time {
 +      color: #ffffff; }
 +  .events-button .events-box .events-list .event-placeholder {
 +    color: #ffffff;
 +    font-style: italic; }
 +
 +.world-clocks-button .world-clocks-header {
 +  color: #ffffff; }
 +  .world-clocks-button .world-clocks-header.no-world-clocks {
 +    color: #ffffff; }
 +
 +.world-clocks-button .world-clocks-grid {
 +  spacing-rows: 6px;
 +  spacing-columns: 12px; }
 +  .world-clocks-button .world-clocks-grid .world-clocks-time {
 +    font-weight: bold; }
 +    .world-clocks-button .world-clocks-grid .world-clocks-time:ltr {
 +      text-align: right; }
 +    .world-clocks-button .world-clocks-grid .world-clocks-time:rtl {
 +      text-align: left; }
 +  .world-clocks-button .world-clocks-grid .world-clocks-timezone {
 +    color: #ffffff; }
 +
 +.weather-button .weather-box {
 +  spacing: 6px; }
 +  .weather-button .weather-box .weather-header-box {
 +    spacing: 6px; }
 +    .weather-button .weather-box .weather-header-box .weather-header {
 +      color: #ffffff; }
 +      .weather-button .weather-box .weather-header-box .weather-header.no-location {
 +        color: #ffffff; }
 +      .weather-button .weather-box .weather-header-box .weather-header.location {
 +        font-weight: normal; }
 +  .weather-button .weather-box .weather-grid {
 +    spacing-rows: 6px;
 +    spacing-columns: 12px; }
 +    .weather-button .weather-box .weather-grid .weather-forecast-time {
 +      padding-top: 6px;
 +      padding-bottom: 6px; }
 +    .weather-button .weather-box .weather-grid .weather-forecast-icon {
 +      icon-size: 2.182em;
 +      margin-bottom: 4px; }
 +    .weather-button .weather-box .weather-grid .weather-forecast-temp {
 +      font-weight: bold; }
 +
 +/* Message List */
 +.message-list {
 +  width: 29em;
 +  border: solid rgba(255, 255, 255, 0.5); }
 +  .message-list:ltr {
 +    margin-left: 0;
 +    margin-right: 4px;
 +    padding-right: 6px;
 +    border-right-width: 1px; }
 +  .message-list:rtl {
 +    margin-right: 0;
 +    margin-left: 4px;
 +    padding-left: 6px;
 +    border-left-width: 1px; }
 +  .message-list .message-list-placeholder {
-     color: #f6d32d;
-     background-color: rgba(246, 211, 45, 0.1);
++    color: rgba(255, 255, 255, 0.45);
++    color: #ffffff; }
 +    .message-list .message-list-placeholder > StIcon {
 +      icon-size: 96px;
 +      margin-bottom: 12px;
 +      -st-icon-style: symbolic; }
 +
 +.message-list-sections {
 +  spacing: 12px; }
 +  .message-list-sections:ltr {
 +    margin-right: 12px; }
 +  .message-list-sections:rtl {
 +    margin-left: 12px; }
 +
 +.message-list-section,
 +.message-list-section-list {
 +  spacing: 12px; }
 +
 +.message-list-controls {
 +  padding: 12px;
 +  padding-bottom: 6px;
 +  spacing: 6px; }
 +  .message-list-controls .dnd-button {
 +    border-width: 2px;
 +    border-color: transparent;
 +    border-radius: 32px;
 +    border-style: solid; }
 +    .message-list-controls .dnd-button:focus {
 +      border-color: st-transparentize(-st-accent-color, 0.4); }
 +
 +.message {
 +  padding: 6px;
 +  margin: 0;
 +  border-radius: 16px; }
 +  .message .message-header {
 +    spacing: 6px;
 +    color: #ffffff;
 +    padding: 0 6px; }
 +    .message .message-header:ltr {
 +      padding-right: 0; }
 +    .message .message-header:rtl {
 +      padding-left: 0; }
 +    .message .message-header .message-source-icon {
 +      icon-size: 1.091em;
 +      -st-icon-style: symbolic; }
 +    .message .message-header .message-header-content {
 +      spacing: 6px;
 +      min-height: 1.637em;
 +      padding-bottom: 6px; }
 +      .message .message-header .message-header-content .message-source-title {
 +        font-weight: bold; }
 +      .message .message-header .message-header-content .event-time {
 +        color: #ffffff;
 +        padding-bottom: 0.068em; }
 +        .message .message-header .message-header-content .event-time:ltr {
 +          text-align: right; }
 +        .message .message-header .message-header-content .event-time:rtl {
 +          text-align: left; }
 +    .message .message-header .message-expand-button,
 +    .message .message-header .message-close-button {
 +      border-radius: 999px;
 +      color: #ffffff; }
 +    .message .message-header .message-expand-button {
 +      padding: 6px; }
 +    .message .message-header .message-close-button {
 +      margin: 3px;
 +      padding: 4px; }
 +  .message .message-box {
 +    padding: 6px;
 +    margin-top: 0;
 +    spacing: 6px; }
 +    .message .message-box .message-icon {
 +      icon-size: 48px; }
 +      .message .message-box .message-icon:ltr {
 +        margin-right: 6px; }
 +      .message .message-box .message-icon:rtl {
 +        margin-left: 6px; }
 +      .message .message-box .message-icon.message-themed-icon {
 +        border-radius: 999px;
 +        background-color: rgba(255, 255, 255, 0.07);
 +        icon-size: 1.091em;
 +        min-width: 48px;
 +        min-height: 48px; }
 +    .message .message-box:first-child {
 +      margin-top: 12px; }
 +    .message .message-box .message-content {
 +      spacing: 4px; }
 +      .message .message-box .message-content .message-title {
 +        font-weight: bold; }
 +  .message .message-action-bin {
 +    padding: 4px;
 +    spacing: 6px; }
 +    .message .message-action-bin * {
 +      margin: 0 4px; }
 +      .message .message-action-bin *:first-child:ltr {
 +        margin-left: 0; }
 +      .message .message-action-bin *:first-child:rtl {
 +        margin-right: 0; }
 +      .message .message-action-bin *:last-child:ltr {
 +        margin-right: 0; }
 +      .message .message-action-bin *:last-child:rtl {
 +        margin-left: 0; }
 +
 +.url-highlighter {
 +  link-color: st-lighten(-st-accent-color, 20%); }
 +
 +/* Media Controls */
 +.message-media-control {
 +  padding: 0 18px;
 +  border-radius: 8px;
 +  color: #ffffff;
 +  border: 1px solid transparent;
 +  border-color: rgba(255, 255, 255, 0.4);
 +  margin: 12px 2px; }
 +  .message-media-control:hover {
 +    background-color: #595959;
 +    color: #ffffff; }
 +  .message-media-control:active {
 +    background-color: #5e5e5e;
 +    color: #ffffff; }
 +  .message-media-control:insensitive {
 +    color: white;
 +    border-color: transparent; }
 +  .message-media-control StIcon {
 +    icon-size: 16px; }
 +
 +.media-message .message-icon {
 +  border-radius: 8px !important; }
 +  .media-message .message-icon.message-themed-icon {
 +    icon-size: 32px !important; }
 +
 +.candidate-popup-content {
 +  padding: 6px;
 +  spacing: 6px;
 +  border-radius: 12px; }
 +
 +.candidate-index {
 +  padding: 0;
 +  padding-right: 6px;
 +  color: #ffffff; }
 +
 +.candidate-box {
 +  padding: 6px 12px 6px 12px;
 +  border-radius: 8px; }
 +  .candidate-box:selected {
 +    background-color: -st-accent-color;
 +    color: -st-accent-fg-color; }
 +  .candidate-box:hover {
 +    background-color: #4d4d4d;
 +    color: white; }
 +
 +.candidate-page-button-box {
 +  height: 2em; }
 +  .vertical .candidate-page-button-box {
 +    padding-top: 12px; }
 +  .horizontal .candidate-page-button-box {
 +    padding-left: 12px; }
 +
 +.candidate-page-button {
 +  padding: 6px; }
 +  .candidate-page-button StIcon {
 +    icon-size: 16px; }
 +
 +.candidate-page-button-previous {
 +  border-radius: 8px 0px 0px 8px;
 +  border-right-width: 0;
 +  box-shadow: none; }
 +
 +.candidate-page-button-next {
 +  border-radius: 0px 8px 8px 0px;
 +  box-shadow: none; }
 +
 +/* Notifications & Message Tray */
 +.notification-banner {
 +  min-height: 64px;
 +  width: 34em;
 +  box-shadow: 0 2px 4px 2px transparent;
 +  border-radius: 16px;
 +  margin: 4px;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); }
 +
 +.notification-buttons-bin {
 +  spacing: 0; }
 +
 +/* Modal Dialogs */
 +.modal-dialog {
 +  background-color: #1a1a1a;
 +  border-radius: 18px;
 +  padding: 24px;
 +  spacing: 18px;
 +  box-shadow: 0 12px 8px 12px rgba(0, 0, 0, 0.03); }
 +  .modal-dialog .modal-dialog-content-box {
 +    padding-top: 12px;
 +    spacing: 18px;
 +    max-width: 28em; }
 +  .modal-dialog .modal-dialog-button-box {
 +    padding-top: 6px; }
 +
 +.dialog-list {
 +  spacing: 18px; }
 +  .dialog-list .dialog-list-title {
 +    text-align: center; }
 +  .dialog-list .dialog-list-scrollview {
 +    max-height: 200px; }
 +  .dialog-list .dialog-list-box {
 +    spacing: 1em; }
 +    .dialog-list .dialog-list-box .dialog-list-item {
 +      spacing: 1em; }
 +      .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-title {
 +        font-weight: bold; }
 +      .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description {
 +        color: #f2f2f2; }
 +
 +/* End Session Dialog */
 +.end-session-dialog {
 +  width: 24em; }
 +  .end-session-dialog .end-session-dialog-battery-warning,
 +  .end-session-dialog .dialog-list-title {
-     color: #f6d32d; }
++    color: #cd9309;
++    background-color: rgba(205, 147, 9, 0.1);
 +    padding: 9px;
 +    border-radius: 8px;
 +    margin: 4px 0; }
 +
 +/* Message Dialog */
 +.message-dialog-content {
 +  spacing: 18px; }
 +  .message-dialog-content .message-dialog-title {
 +    text-align: center; }
 +  .message-dialog-content .message-dialog-description {
 +    text-align: center; }
 +
 +/* Run Dialog */
 +.run-dialog {
 +  width: 24em;
 +  padding-bottom: 6px; }
 +  .run-dialog .run-dialog-entry {
 +    padding: 12px 9px; }
 +  .run-dialog .run-dialog-description {
 +    color: #cccccc; }
 +
 +/* Password or Authentication Dialog */
 +.prompt-dialog {
 +  width: 28em; }
 +  .prompt-dialog .prompt-dialog-password-grid {
 +    spacing-rows: 8px;
 +    spacing-columns: 4px; }
 +    .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry {
 +      width: auto; }
 +      .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry:ltr {
 +        margin-left: 20px; }
 +      .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry:rtl {
 +        margin-right: 20px; }
 +  .prompt-dialog .prompt-dialog-password-layout {
 +    spacing: 8px; }
 +  .prompt-dialog .prompt-dialog-password-entry {
 +    width: 20em;
 +    padding: 12px 9px; }
 +  .prompt-dialog .prompt-dialog-error-label,
 +  .prompt-dialog .prompt-dialog-info-label,
 +  .prompt-dialog .prompt-dialog-null-label {
 +    text-align: center; }
 +  .prompt-dialog .prompt-dialog-error-label {
-     color: #f6d32d; }
++    color: #cd9309; }
 +
 +/* Polkit Dialog */
 +.polkit-dialog-user-layout {
 +  text-align: center;
 +  spacing: 8px;
 +  margin-bottom: 6px; }
 +  .polkit-dialog-user-layout .polkit-dialog-user-root-label {
-       border: none; }
++    color: #cd9309; }
 +
 +/* Audio selection dialog */
 +.audio-device-selection-dialog {
 +  min-width: 24em; }
 +  .audio-device-selection-dialog .audio-selection-box {
 +    spacing: 12px; }
 +    .audio-device-selection-dialog .audio-selection-box .audio-selection-device {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: #000000;
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      box-shadow: none;
-         box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-         background-color: st-mix(-st-accent-color, rgba(0, 0, 0, 0.25), 5%); }
++      border: none;
++      background-color: transparent; }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device:focus {
 +        box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +        color: #ffffff;
-           background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
++        box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(0, 0, 0, 0.25), 5%); }
 +        .audio-device-selection-dialog .audio-selection-box .audio-selection-device:focus:hover {
-           background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
++          background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device:hover {
 +        box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +        color: #ffffff;
 +        background-color: st-mix(st-lighten(#000000, 7%), #ffffff, 87%); }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active {
 +        box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +        color: #ffffff;
 +        background-color: st-mix(st-lighten(#000000, 9%), #ffffff, 87%); }
 +        .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active:hover {
 +          background-color: st-lighten(st-lighten(#000000, 9%), 7%); }
 +        .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active:focus {
- .osd-monitor-label {
++          background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked {
 +        box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +        color: #ffffff;
 +        background-color: st-mix(st-lighten(#000000, 8%), #ffffff, 87%); }
 +        .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted:hover, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected:hover, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked:hover {
 +          background-color: st-lighten(st-lighten(#000000, 8%), 7%); }
 +        .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted:active, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected:active, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked:active {
 +          background-color: st-lighten(st-lighten(#000000, 8%), 9%); }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device:insensitive {
 +        box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +        color: st-transparentize(#ffffff, 0.5);
 +        background-color: #000000;
 +        box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +        box-shadow: none;
 +        border: none; }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device:drop {
 +        background-color: st-transparentize(-st-accent-color, 0.8);
 +        box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device .audio-selection-device-box {
 +        padding: 12px;
 +        spacing: 12px; }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device .audio-selection-device-icon {
 +        icon-size: 64px; }
 +
 +/* Welcome dialog */
 +.welcome-dialog-image {
 +  background-image: url("resource:///org/gnome/shell/theme/gnome-shell-start.svg");
 +  background-size: contain;
 +  /* Reasonable maximum dimensions */
 +  height: 300px;
 +  width: 300px; }
 +
 +/* Access portal dialog */
 +.access-dialog {
 +  text-align: center; }
 +
 +/* OSD */
 +.osd-window {
 +  text-align: center;
 +  font-weight: bold;
 +  spacing: 12px;
 +  padding: 12px 18px;
 +  margin-bottom: 4em; }
 +  .osd-window > * {
 +    spacing: 8px; }
 +  .osd-window StIcon {
 +    icon-size: 32px; }
 +  .osd-window StLabel:ltr {
 +    margin-right: 6px; }
 +  .osd-window StLabel:rtl {
 +    margin-left: 6px; }
 +  .osd-window .level {
 +    margin-bottom: 4px;
 +    min-width: 160px;
 +    -barlevel-height: 6px;
 +    -barlevel-background-color: rgba(255, 255, 255, 0.1);
 +    -barlevel-active-background-color: #ffffff;
 +    -barlevel-overdrive-color: #c01c28;
 +    -barlevel-overdrive-separator-width: 3px; }
 +    .osd-window .level:first-child {
 +      margin-bottom: 0; }
 +    .osd-window .level:ltr {
 +      margin-right: 6px; }
 +    .osd-window .level:rtl {
 +      margin-left: 6px; }
 +
-     border: none; }
++.osd-monitor-label, .osd-break-countdown-label {
 +  background-color: -st-accent-color;
 +  color: -st-accent-fg-color;
 +  border-radius: 16px;
 +  font-size: 3em;
 +  font-weight: bold;
 +  font-feature-settings: "tnum";
 +  margin: 12px;
 +  padding: 12px;
 +  text-align: center;
 +  min-width: 1.5em; }
 +
 +/* Pad OSD */
 +.pad-osd-window {
 +  padding: 32px;
 +  background-color: rgba(0, 0, 0, 0.8); }
 +  .pad-osd-window .pad-osd-title-box {
 +    spacing: 12px; }
 +  .pad-osd-window .pad-osd-title-menu-box {
 +    spacing: 6px; }
 +
 +.combo-box-label {
 +  width: 15em; }
 +
 +/* App Switcher */
 +.switcher-popup {
 +  padding: 0;
 +  spacing: 24px; }
 +
 +.switcher-list {
 +  padding: 12px;
 +  border-radius: 28px;
 +  box-shadow: 0 8px 8px 0 transparent; }
 +  .switcher-list .switcher-list-item-container {
 +    spacing: 12px; }
 +  .switcher-list .item-box {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: #000000;
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
-       box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-       background-color: st-mix(-st-accent-color, rgba(0, 0, 0, 0.25), 5%); }
++    border: none;
++    background-color: transparent; }
 +    .switcher-list .item-box:focus {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
-         background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
++      box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(0, 0, 0, 0.25), 5%); }
 +      .switcher-list .item-box:focus:hover {
-         background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
 +    .switcher-list .item-box:hover {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(#000000, 7%), #ffffff, 87%); }
 +    .switcher-list .item-box:active {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(#000000, 9%), #ffffff, 87%); }
 +      .switcher-list .item-box:active:hover {
 +        background-color: st-lighten(st-lighten(#000000, 9%), 7%); }
 +      .switcher-list .item-box:active:focus {
-       color: whitesmoke;
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
 +    .switcher-list .item-box:highlighted, .switcher-list .item-box:selected, .switcher-list .item-box:checked {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(#000000, 8%), #ffffff, 87%); }
 +      .switcher-list .item-box:highlighted:hover, .switcher-list .item-box:selected:hover, .switcher-list .item-box:checked:hover {
 +        background-color: st-lighten(st-lighten(#000000, 8%), 7%); }
 +      .switcher-list .item-box:highlighted:active, .switcher-list .item-box:selected:active, .switcher-list .item-box:checked:active {
 +        background-color: st-lighten(st-lighten(#000000, 8%), 9%); }
 +    .switcher-list .item-box:insensitive {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: st-transparentize(#ffffff, 0.5);
 +      background-color: #000000;
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      box-shadow: none;
 +      border: none; }
 +    .switcher-list .item-box:drop {
 +      background-color: st-transparentize(-st-accent-color, 0.8);
 +      box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
 +    .switcher-list .item-box:hover {
 +      background: none; }
 +    .switcher-list .item-box:selected {
 +      background-color: rgba(255, 255, 255, 0.2); }
 +    .switcher-list .item-box:selected {
 +      background-color: rgba(255, 255, 255, 0.3); }
 +  .switcher-list .separator {
 +    width: 1px;
 +    background: rgba(255, 255, 255, 0.5); }
 +  .switcher-list .thumbnail-box {
 +    padding: 2px;
 +    spacing: 6px; }
 +  .switcher-list .thumbnail {
 +    width: 256px;
 +    border-radius: 8px; }
 +
 +.switcher-arrow {
 +  border-color: rgba(255, 255, 255, 0.8);
 +  color: rgba(255, 255, 255, 0.8); }
 +  .switcher-arrow:highlighted {
 +    border-color: #ffffff;
 +    color: #ffffff; }
 +
 +.input-source-switcher-symbol {
 +  font-size: 34pt;
 +  width: 96px;
 +  height: 96px; }
 +
 +.cycler-highlight {
 +  border: 5px solid -st-accent-color; }
 +
 +/* Workspace Switcher */
 +.workspace-switcher {
 +  margin-bottom: 4em;
 +  spacing: 12px;
 +  padding: 12px 18px; }
 +
 +.ws-switcher-indicator {
 +  background-color: rgba(255, 255, 255, 0.5);
 +  padding: 2.6666666667px;
 +  margin: 13.3333333333px;
 +  border-radius: 32px; }
 +  .ws-switcher-indicator:active {
 +    background-color: #ffffff;
 +    padding: 5.3333333333px;
 +    margin: 10.6666666667px; }
 +
 +.screenshot-ui-panel {
 +  border-radius: 32px;
 +  padding: 18px;
 +  padding-bottom: 12px;
 +  margin-bottom: 4em;
 +  spacing: 12px; }
 +
 +.screenshot-ui-close-button {
 +  padding: 6px !important;
 +  margin-top: 12px;
 +  box-shadow: 0 2px 4px 0 transparent; }
 +  .screenshot-ui-close-button.left {
 +    margin-left: 12px; }
 +  .screenshot-ui-close-button.right {
 +    margin-right: 12px; }
 +
 +.screenshot-ui-type-button {
 +  min-width: 48px;
 +  padding: 12px 18px;
 +  border-radius: 14px; }
 +  .screenshot-ui-type-button .icon-label-button-container {
 +    spacing: 0.409em; }
 +    .screenshot-ui-type-button .icon-label-button-container > StIcon {
 +      icon-size: 32px; }
 +
 +.screenshot-ui-capture-button {
 +  width: 32px;
 +  height: 32px;
 +  border-radius: 999px;
 +  border: 4px #ffffff;
 +  padding: 4px; }
 +  .screenshot-ui-capture-button .screenshot-ui-capture-button-circle {
 +    background-color: #ffffff;
 +    transition-duration: 200ms;
 +    border-radius: 999px; }
 +    .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:hover, .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:focus {
 +      background-color: #4d4d4d; }
 +  .screenshot-ui-capture-button:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:focus .screenshot-ui-capture-button-circle {
 +    background-color: #cccccc; }
 +  .screenshot-ui-capture-button:active .screenshot-ui-capture-button-circle {
 +    background-color: gray; }
 +  .screenshot-ui-capture-button:cast .screenshot-ui-capture-button-circle {
 +    background-color: #c01c28; }
 +  .screenshot-ui-capture-button:cast:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:cast:focus .screenshot-ui-capture-button-circle {
 +    background-color: #d61f2d; }
 +  .screenshot-ui-capture-button:cast:active .screenshot-ui-capture-button-circle {
 +    background-color: #a11722; }
 +
 +.screenshot-ui-shot-cast-container {
 +  background-color: rgba(255, 255, 255, 0.1);
 +  border-radius: 999px;
 +  padding: 3px;
 +  spacing: 3px;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); }
 +
 +.screenshot-ui-shot-cast-button {
 +  padding: 6px 12px;
 +  background-color: transparent;
 +  border-radius: 999px;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); }
 +  .screenshot-ui-shot-cast-button > StIcon {
 +    icon-size: 16px; }
 +  .screenshot-ui-shot-cast-button:hover, .screenshot-ui-shot-cast-button:focus {
 +    background-color: rgba(255, 255, 255, 0.2); }
 +  .screenshot-ui-shot-cast-button:active {
 +    background-color: rgba(255, 255, 255, 0.5); }
 +  .screenshot-ui-shot-cast-button:checked {
 +    background-color: #ffffff;
 +    color: #000000; }
 +  .screenshot-ui-shot-cast-button:insensitive {
 +    color: rgba(255, 255, 255, 0.5); }
 +
 +.screenshot-ui-area-indicator-shade {
 +  background-color: rgba(0, 0, 0, 0.3); }
 +
 +.screenshot-ui-area-selector .screenshot-ui-area-indicator-shade {
 +  background-color: rgba(0, 0, 0, 0.5); }
 +
 +.screenshot-ui-area-selector .screenshot-ui-area-indicator-selection {
 +  border: 2px white; }
 +
 +.screenshot-ui-area-selector-handle {
 +  border-radius: 999px;
 +  background-color: white;
 +  box-shadow: 0 1px 3px 2px transparent;
 +  width: 24px;
 +  height: 24px; }
 +
 +.screenshot-ui-window-selector {
 +  background-color: #000000; }
 +  .screenshot-ui-window-selector .screenshot-ui-window-selector-window-container {
 +    margin: 100px; }
 +  .screenshot-ui-window-selector:primary-monitor .screenshot-ui-window-selector-window-container {
 +    margin-bottom: 200px; }
 +
 +.screenshot-ui-window-selector-window-border {
 +  transition-duration: 200ms;
 +  border-radius: 16px;
 +  border: 6px transparent; }
 +
 +.screenshot-ui-window-selector-check {
 +  transition-duration: 200ms;
 +  color: transparent;
 +  border-radius: 999px;
 +  border-width: 12px;
 +  icon-size: 24px; }
 +
 +.screenshot-ui-window-selector-window:hover .screenshot-ui-window-selector-window-border {
 +  border-color: st-darken(-st-accent-color, 15%); }
 +
 +.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-window-border {
 +  border-color: -st-accent-color;
 +  background-color: st-transparentize(-st-accent-color, 0.8); }
 +
 +.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-check {
 +  color: -st-accent-fg-color;
 +  background-color: -st-accent-color; }
 +
 +.screenshot-ui-screen-selector {
 +  transition-duration: 200ms;
 +  background-color: rgba(0, 0, 0, 0.5); }
 +  .screenshot-ui-screen-selector:hover {
 +    background-color: rgba(0, 0, 0, 0.3); }
 +  .screenshot-ui-screen-selector:active {
 +    background-color: rgba(0, 0, 0, 0.7); }
 +  .screenshot-ui-screen-selector:checked {
 +    background-color: transparent;
 +    border: 2px white; }
 +
 +.screenshot-ui-tooltip {
 +  text-align: center;
 +  -y-offset: 24px; }
 +
 +/* Top Bar */
 +#panel {
 +  background-color: #000000;
 +  font-weight: bold;
 +  height: 2.2em;
 +  transition-duration: 250ms; }
 +  #panel .panel-button {
 +    transition-duration: 150ms;
 +    border: 3px solid transparent;
 +    background-color: transparent;
 +    border-radius: 999px;
 +    font-weight: bold;
 +    color: #ffffff;
 +    box-shadow: inset 0 0 0 100px transparent;
 +    -natural-hpadding: 12px;
 +    -minimum-hpadding: 6px; }
 +    #panel .panel-button:focus, #panel .panel-button:hover {
 +      box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
 +    #panel .panel-button:active, #panel .panel-button:checked {
 +      box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
 +      #panel .panel-button:active:hover, #panel .panel-button:checked:hover {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
 +    #panel .panel-button .system-status-icon {
 +      icon-size: 1.091em;
 +      padding: 0 6px;
 +      margin: 0 4px; }
 +    #panel .panel-button .app-menu-icon {
 +      -st-icon-style: symbolic; }
 +    #panel .panel-button .panel-status-menu-box,
 +    #panel .panel-button .panel-status-indicators-box {
 +      spacing: 4px; }
 +      #panel .panel-button .panel-status-menu-box > .system-status-icon,
 +      #panel .panel-button .panel-status-indicators-box > .system-status-icon {
 +        padding: 0; }
 +    #panel .panel-button#panelActivities StBoxLayout {
 +      padding: 0 0.2045em;
 +      spacing: 5px; }
 +    #panel .panel-button#panelActivities .workspace-dot {
 +      border-radius: 999px;
 +      min-width: 0.5455em;
 +      min-height: 0.5455em;
 +      background-color: #ffffff; }
 +    #panel .panel-button.screen-recording-indicator StBoxLayout, #panel .panel-button.screen-sharing-indicator StBoxLayout {
 +      spacing: 0.409em; }
 +    #panel .panel-button.screen-recording-indicator StIcon, #panel .panel-button.screen-sharing-indicator StIcon {
 +      icon-size: 1.091em; }
 +    #panel .panel-button.screen-recording-indicator {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
-       color: whitesmoke;
++      color: #fafafb;
 +      box-shadow: inset 0 0 0 100px #c01c28; }
 +      #panel .panel-button.screen-recording-indicator:focus, #panel .panel-button.screen-recording-indicator:hover {
 +        box-shadow: inset 0 0 0 100px #d61f2d; }
 +      #panel .panel-button.screen-recording-indicator:active, #panel .panel-button.screen-recording-indicator:checked {
 +        box-shadow: inset 0 0 0 100px #e02a37; }
 +        #panel .panel-button.screen-recording-indicator:active:hover, #panel .panel-button.screen-recording-indicator:checked:hover {
 +          box-shadow: inset 0 0 0 100px #e13340; }
 +    #panel .panel-button.screen-sharing-indicator {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
-       color: whitesmoke;
++      color: #fafafb;
 +      box-shadow: inset 0 0 0 100px #ff7800; }
 +      #panel .panel-button.screen-sharing-indicator:focus, #panel .panel-button.screen-sharing-indicator:hover {
 +        box-shadow: inset 0 0 0 100px #ff861a; }
 +      #panel .panel-button.screen-sharing-indicator:active, #panel .panel-button.screen-sharing-indicator:checked {
 +        box-shadow: inset 0 0 0 100px #ff902e; }
 +        #panel .panel-button.screen-sharing-indicator:active:hover, #panel .panel-button.screen-sharing-indicator:checked:hover {
 +          box-shadow: inset 0 0 0 100px #ff9638; }
 +    #panel .panel-button.clock-display {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
 +      color: #ffffff;
 +      box-shadow: inset 0 0 0 100px transparent;
 +      background: none !important;
 +      box-shadow: none !important;
 +      border: none !important; }
 +      #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:hover {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
 +      #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:checked {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
 +        #panel .panel-button.clock-display:active:hover, #panel .panel-button.clock-display:checked:hover {
 +          box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
 +      #panel .panel-button.clock-display .clock {
 +        transition-duration: 150ms;
 +        border: 3px solid transparent;
 +        border-radius: 999px; }
 +      #panel .panel-button.clock-display:focus .clock, #panel .panel-button.clock-display:hover .clock {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
 +      #panel .panel-button.clock-display:active .clock, #panel .panel-button.clock-display:checked .clock {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
 +        #panel .panel-button.clock-display:active .clock:hover, #panel .panel-button.clock-display:checked .clock:hover {
 +          box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
 +      #panel .panel-button.clock-display .messages-indicator {
 +        icon-size: 1.091em; }
 +  #panel:overview, #panel.unlock-screen, #panel.login-screen {
 +    background-color: transparent; }
 +    #panel:overview .panel-button.screen-recording-indicator, #panel.unlock-screen .panel-button.screen-recording-indicator, #panel.login-screen .panel-button.screen-recording-indicator {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
-       color: whitesmoke;
++      color: #fafafb;
 +      box-shadow: inset 0 0 0 100px #c01c28; }
 +      #panel:overview .panel-button.screen-recording-indicator:focus, #panel:overview .panel-button.screen-recording-indicator:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:focus, #panel.unlock-screen .panel-button.screen-recording-indicator:hover, #panel.login-screen .panel-button.screen-recording-indicator:focus, #panel.login-screen .panel-button.screen-recording-indicator:hover {
 +        box-shadow: inset 0 0 0 100px #d61f2d; }
 +      #panel:overview .panel-button.screen-recording-indicator:active, #panel:overview .panel-button.screen-recording-indicator:checked, #panel.unlock-screen .panel-button.screen-recording-indicator:active, #panel.unlock-screen .panel-button.screen-recording-indicator:checked, #panel.login-screen .panel-button.screen-recording-indicator:active, #panel.login-screen .panel-button.screen-recording-indicator:checked {
 +        box-shadow: inset 0 0 0 100px #e02a37; }
 +        #panel:overview .panel-button.screen-recording-indicator:active:hover, #panel:overview .panel-button.screen-recording-indicator:checked:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:active:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:checked:hover, #panel.login-screen .panel-button.screen-recording-indicator:active:hover, #panel.login-screen .panel-button.screen-recording-indicator:checked:hover {
 +          box-shadow: inset 0 0 0 100px #e13340; }
 +    #panel:overview .panel-button.screen-sharing-indicator, #panel.unlock-screen .panel-button.screen-sharing-indicator, #panel.login-screen .panel-button.screen-sharing-indicator {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
- .quick-toggle, .quick-menu-toggle {
++      color: #fafafb;
 +      box-shadow: inset 0 0 0 100px #ff7800; }
 +      #panel:overview .panel-button.screen-sharing-indicator:focus, #panel:overview .panel-button.screen-sharing-indicator:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:focus, #panel.unlock-screen .panel-button.screen-sharing-indicator:hover, #panel.login-screen .panel-button.screen-sharing-indicator:focus, #panel.login-screen .panel-button.screen-sharing-indicator:hover {
 +        box-shadow: inset 0 0 0 100px #ff861a; }
 +      #panel:overview .panel-button.screen-sharing-indicator:active, #panel:overview .panel-button.screen-sharing-indicator:checked, #panel.unlock-screen .panel-button.screen-sharing-indicator:active, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked, #panel.login-screen .panel-button.screen-sharing-indicator:active, #panel.login-screen .panel-button.screen-sharing-indicator:checked {
 +        box-shadow: inset 0 0 0 100px #ff902e; }
 +        #panel:overview .panel-button.screen-sharing-indicator:active:hover, #panel:overview .panel-button.screen-sharing-indicator:checked:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:active:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked:hover, #panel.login-screen .panel-button.screen-sharing-indicator:active:hover, #panel.login-screen .panel-button.screen-sharing-indicator:checked:hover {
 +          box-shadow: inset 0 0 0 100px #ff9638; }
 +  #panel.unlock-screen .panel-button, #panel.login-screen .panel-button {
 +    transition-duration: 150ms;
 +    border: 3px solid transparent;
 +    background-color: transparent;
 +    border-radius: 999px;
 +    font-weight: bold;
 +    color: #ffffff;
 +    box-shadow: inset 0 0 0 100px transparent; }
 +    #panel.unlock-screen .panel-button:focus, #panel.unlock-screen .panel-button:hover, #panel.login-screen .panel-button:focus, #panel.login-screen .panel-button:hover {
 +      box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
 +    #panel.unlock-screen .panel-button:active, #panel.unlock-screen .panel-button:checked, #panel.login-screen .panel-button:active, #panel.login-screen .panel-button:checked {
 +      box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
 +      #panel.unlock-screen .panel-button:active:hover, #panel.unlock-screen .panel-button:checked:hover, #panel.login-screen .panel-button:active:hover, #panel.login-screen .panel-button:checked:hover {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
 +    #panel.unlock-screen .panel-button.clock-display, #panel.login-screen .panel-button.clock-display {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
 +      color: #ffffff;
 +      box-shadow: inset 0 0 0 100px transparent;
 +      background: none !important;
 +      box-shadow: none !important;
 +      border: none !important; }
 +      #panel.unlock-screen .panel-button.clock-display:focus, #panel.unlock-screen .panel-button.clock-display:hover, #panel.login-screen .panel-button.clock-display:focus, #panel.login-screen .panel-button.clock-display:hover {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
 +      #panel.unlock-screen .panel-button.clock-display:active, #panel.unlock-screen .panel-button.clock-display:checked, #panel.login-screen .panel-button.clock-display:active, #panel.login-screen .panel-button.clock-display:checked {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
 +        #panel.unlock-screen .panel-button.clock-display:active:hover, #panel.unlock-screen .panel-button.clock-display:checked:hover, #panel.login-screen .panel-button.clock-display:active:hover, #panel.login-screen .panel-button.clock-display:checked:hover {
 +          box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
 +      #panel.unlock-screen .panel-button.clock-display .clock, #panel.login-screen .panel-button.clock-display .clock {
 +        transition-duration: 150ms;
 +        border: 3px solid transparent;
 +        border-radius: 999px; }
 +      #panel.unlock-screen .panel-button.clock-display:focus .clock, #panel.unlock-screen .panel-button.clock-display:hover .clock, #panel.login-screen .panel-button.clock-display:focus .clock, #panel.login-screen .panel-button.clock-display:hover .clock {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
 +      #panel.unlock-screen .panel-button.clock-display:active .clock, #panel.unlock-screen .panel-button.clock-display:checked .clock, #panel.login-screen .panel-button.clock-display:active .clock, #panel.login-screen .panel-button.clock-display:checked .clock {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
 +        #panel.unlock-screen .panel-button.clock-display:active .clock:hover, #panel.unlock-screen .panel-button.clock-display:checked .clock:hover, #panel.login-screen .panel-button.clock-display:active .clock:hover, #panel.login-screen .panel-button.clock-display:checked .clock:hover {
 +          box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
 +  #panel:overview .panel-button {
 +    transition-duration: 150ms;
 +    border: 3px solid transparent;
 +    background-color: transparent;
 +    border-radius: 999px;
 +    font-weight: bold;
 +    color: #ffffff;
 +    box-shadow: inset 0 0 0 100px transparent; }
 +    #panel:overview .panel-button:focus, #panel:overview .panel-button:hover {
 +      box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
 +    #panel:overview .panel-button:active, #panel:overview .panel-button:checked {
 +      box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
 +      #panel:overview .panel-button:active:hover, #panel:overview .panel-button:checked:hover {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
 +    #panel:overview .panel-button#panelActivities .workspace-dot {
 +      background-color: #ffffff; }
 +    #panel:overview .panel-button.clock-display {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
 +      color: #ffffff;
 +      box-shadow: inset 0 0 0 100px transparent;
 +      background: none !important;
 +      box-shadow: none !important;
 +      border: none !important; }
 +      #panel:overview .panel-button.clock-display:focus, #panel:overview .panel-button.clock-display:hover {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
 +      #panel:overview .panel-button.clock-display:active, #panel:overview .panel-button.clock-display:checked {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
 +        #panel:overview .panel-button.clock-display:active:hover, #panel:overview .panel-button.clock-display:checked:hover {
 +          box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
 +      #panel:overview .panel-button.clock-display .clock {
 +        transition-duration: 150ms;
 +        border: 3px solid transparent;
 +        border-radius: 999px; }
 +      #panel:overview .panel-button.clock-display:focus .clock, #panel:overview .panel-button.clock-display:hover .clock {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
 +      #panel:overview .panel-button.clock-display:active .clock, #panel:overview .panel-button.clock-display:checked .clock {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
 +        #panel:overview .panel-button.clock-display:active .clock:hover, #panel:overview .panel-button.clock-display:checked .clock:hover {
 +          box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
 +  #panel .panel-status-indicators-box,
 +  #panel .panel-status-menu-box {
 +    spacing: 2px; }
 +  #panel .power-status.panel-status-indicators-box {
 +    spacing: 0; }
 +  #panel .privacy-indicator {
 +    color: #ff7800; }
 +
 +#appMenu {
 +  spacing: 0.409em; }
 +  #appMenu .label-shadow {
 +    color: transparent; }
 +
 +#appMenu .panel-status-menu-box {
 +  padding: 0 0.409em;
 +  spacing: 0.409em; }
 +
 +.clock-display-box {
 +  spacing: 2px; }
 +  .clock-display-box .clock {
 +    padding-left: 0.818em;
 +    padding-right: 0.818em; }
 +
 +/* Activities Ripple */
 +.ripple-box {
 +  background-color: rgba(255, 255, 255, 0.2);
 +  box-shadow: 0 0 2px 2px rgba(255, 255, 255, 0.2);
 +  width: 52px;
 +  height: 52px;
 +  border-radius: 0 0 52px 0; }
 +  .ripple-box:rtl {
 +    border-radius: 0 0 0 52px; }
 +
 +.quick-settings {
 +  padding: 18px;
 +  border-radius: 36px; }
 +  .quick-settings .icon-button, .quick-settings .login-dialog-button.cancel-button, .quick-settings .login-dialog-button.switch-user-button, .quick-settings .login-dialog-button.login-dialog-session-list-button, .quick-settings .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-settings .pager-button, .quick-settings .message .message-header .message-expand-button, .message .message-header .quick-settings .message-expand-button,
 +  .quick-settings .message .message-header .message-close-button,
 +  .message .message-header .quick-settings .message-close-button, .quick-settings .screenshot-ui-show-pointer-button, .quick-settings .button {
 +    padding: 10.5px; }
 +
 +.quick-settings-grid {
 +  spacing-rows: 12px;
 +  spacing-columns: 12px; }
 +
-   min-height: 3.273em;
-   border: none; }
++.quick-toggle, .quick-toggle-has-menu {
 +  border-radius: 999px;
 +  min-width: 12em;
 +  max-width: 12em;
-   background-color: none;
++  min-height: 3.273em; }
 +
 +.quick-toggle {
-   .quick-toggle .quick-toggle-title {
-     font-weight: bold; }
-   .quick-toggle StBoxLayout > .quick-toggle-subtitle {
 +  /* Move padding into the box; this is to allow menu arrows
 +     to extend to the border */ }
 +  .quick-toggle > StBoxLayout {
 +    spacing: 9px; }
 +  .quick-toggle.button {
 +    padding: 0; }
 +  .quick-toggle > StBoxLayout {
 +    padding: 0 12px; }
 +  .quick-toggle:ltr > StBoxLayout {
 +    padding-left: 15px; }
 +  .quick-toggle:rtl > StBoxLayout {
 +    padding-right: 15px; }
- .quick-menu-toggle .quick-toggle {
++  .quick-toggle .quick-toggle-subtitle {
 +    font-weight: normal; }
 +  .quick-toggle .quick-toggle-icon {
 +    icon-size: 1.091em; }
 +
-   .quick-menu-toggle .quick-toggle:ltr {
++.quick-toggle-has-menu .quick-toggle {
 +  min-width: auto;
 +  max-width: auto; }
-   .quick-menu-toggle .quick-toggle:ltr > StBoxLayout {
-     padding-right: 0.6135em; }
-   .quick-menu-toggle .quick-toggle:rtl {
++  .quick-toggle-has-menu .quick-toggle:ltr {
 +    border-radius: 999px 0 0 999px; }
-   .quick-menu-toggle .quick-toggle:rtr > StBoxLayout {
-     padding-left: 0.6135em; }
-   .quick-menu-toggle .quick-toggle:ltr:last-child {
++    .quick-toggle-has-menu .quick-toggle:ltr > StBoxLayout {
++      padding-right: 0.6135em; }
++  .quick-toggle-has-menu .quick-toggle:rtl {
 +    border-radius: 0 999px 999px 0; }
-   .quick-menu-toggle .quick-toggle:rtl:last-child {
++    .quick-toggle-has-menu .quick-toggle:rtl > StBoxLayout {
++      padding-left: 0.6135em; }
++  .quick-toggle-has-menu .quick-toggle:ltr:last-child {
 +    border-radius: 999px; }
- .quick-menu-toggle .quick-toggle-arrow {
-   padding: 0.409em 0.71575em;
-   border-width: 0;
-   border-color: rgba(255, 255, 255, 0.25); }
-   .quick-menu-toggle .quick-toggle-arrow:checked {
-     border-color: st-lighten(-st-accent-color, 30%); }
-   .quick-menu-toggle .quick-toggle-arrow:ltr {
-     border-radius: 0 999px 999px 0;
-     border-left-width: 1px; }
-   .quick-menu-toggle .quick-toggle-arrow:rtl {
-     border-radius: 999px 0 0 999px;
-     border-right-width: 1px; }
++  .quick-toggle-has-menu .quick-toggle:rtl:last-child {
 +    border-radius: 999px; }
 +
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); }
++.quick-toggle-has-menu .quick-toggle-menu-button {
++  padding: 0.409em 0.71575em; }
++  .quick-toggle-has-menu .quick-toggle-menu-button:ltr {
++    border-radius: 0 999px 999px 0; }
++  .quick-toggle-has-menu .quick-toggle-menu-button:rtl {
++    border-radius: 999px 0 0 999px; }
++
++.quick-toggle-has-menu .quick-toggle-separator {
++  width: 1px; }
++
++.quick-toggle-has-menu .quick-toggle-menu-button {
++  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++  color: #ffffff;
++  background-color: st-mix(st-mix(#ffffff, #525252, 9%), #ffffff, 87%); }
++  .quick-toggle-has-menu .quick-toggle-menu-button:focus {
++    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++    color: #ffffff;
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #525252, 9%), #ffffff, 87%), 5%); }
++    .quick-toggle-has-menu .quick-toggle-menu-button:focus:hover {
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #525252, 9%), 4%), #ffffff, 87%), 5%); }
++  .quick-toggle-has-menu .quick-toggle-menu-button:hover {
++    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++    color: #ffffff;
++    background-color: st-mix(st-lighten(st-mix(#ffffff, #525252, 9%), 4%), #ffffff, 87%); }
++  .quick-toggle-has-menu .quick-toggle-menu-button:active {
++    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++    color: #ffffff;
++    background-color: st-mix(st-lighten(st-mix(#ffffff, #525252, 9%), 9%), #ffffff, 87%); }
++    .quick-toggle-has-menu .quick-toggle-menu-button:active:hover {
++      background-color: st-lighten(st-lighten(st-mix(#ffffff, #525252, 9%), 9%), 4%); }
++    .quick-toggle-has-menu .quick-toggle-menu-button:active:focus {
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #525252, 9%), 9%), #ffffff, 87%), 5%); }
++  .quick-toggle-has-menu .quick-toggle-menu-button:checked {
++    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++    box-shadow: none;
++    border: none;
++    color: -st-accent-fg-color;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 75%), #ffffff, 87%); }
++    .quick-toggle-has-menu .quick-toggle-menu-button:checked:focus {
++      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++      box-shadow: none;
++      border: none;
++      color: -st-accent-fg-color;
++      box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++      box-shadow: inset 0 0 0 2px st-transparentize(st-lighten(-st-accent-color, 30%), 0.1) !important;
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(-st-accent-color, #ffffff, 75%), #ffffff, 87%), 5%); }
++      .quick-toggle-has-menu .quick-toggle-menu-button:checked:focus:hover {
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(-st-accent-color, #ffffff, 75%), 4%), #ffffff, 87%), 5%); }
++    .quick-toggle-has-menu .quick-toggle-menu-button:checked:hover {
++      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++      box-shadow: none;
++      border: none;
++      color: -st-accent-fg-color;
++      background-color: st-mix(st-lighten(st-mix(-st-accent-color, #ffffff, 75%), 4%), #ffffff, 87%); }
++    .quick-toggle-has-menu .quick-toggle-menu-button:checked:active {
++      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++      box-shadow: none;
++      border: none;
++      color: -st-accent-fg-color;
++      background-color: st-mix(st-lighten(st-mix(-st-accent-color, #ffffff, 75%), 9%), #ffffff, 87%); }
++      .quick-toggle-has-menu .quick-toggle-menu-button:checked:active:hover {
++        background-color: st-lighten(st-lighten(st-mix(-st-accent-color, #ffffff, 75%), 9%), 4%); }
++      .quick-toggle-has-menu .quick-toggle-menu-button:checked:active:focus {
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(-st-accent-color, #ffffff, 75%), 9%), #ffffff, 87%), 5%); }
++
++.quick-toggle-has-menu:checked .quick-toggle-separator {
++  background-color: transparent; }
++
++.quick-toggle-has-menu .quick-toggle-separator {
++  background-color: transparent; }
 +
 +.quick-slider > StBoxLayout {
 +  spacing: 6px; }
 +
 +.quick-slider .icon-button, .quick-slider .login-dialog-button.cancel-button, .quick-slider .login-dialog-button.switch-user-button, .quick-slider .login-dialog-button.login-dialog-session-list-button, .quick-slider .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-slider .pager-button, .quick-slider .message .message-header .message-expand-button, .message .message-header .quick-slider .message-expand-button,
 +.quick-slider .message .message-header .message-close-button,
 +.message .message-header .quick-slider .message-close-button, .quick-slider .screenshot-ui-show-pointer-button {
 +  padding: 6px; }
 +
 +.quick-slider .slider-bin {
 +  padding: 6px;
 +  border-radius: 999px; }
 +  .quick-slider .slider-bin:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); }
 +    .quick-slider .slider-bin:focus:hover {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, rgba(37, 37, 37, 0.25), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); }
 +
 +.quick-toggle-menu {
 +  border-radius: 24px;
 +  margin: 12px 18px 0; }
 +  .quick-toggle-menu:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%); }
 +  .quick-toggle-menu .popup-menu-item > StIcon {
 +    -st-icon-style: symbolic;
 +    icon-size: 1.091em; }
 +  .quick-toggle-menu .header {
 +    spacing-rows: 3px;
 +    spacing-columns: 12px;
 +    padding-bottom: 12px; }
 +    .quick-toggle-menu .header .icon {
 +      icon-size: 1.6365em;
 +      border-radius: 999px;
 +      padding: 9px;
 +      background-color: rgba(255, 255, 255, 0.2);
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); }
 +      .quick-toggle-menu .header .icon.active {
 +        background-color: -st-accent-color;
 +        color: -st-accent-fg-color; }
 +      .quick-toggle-menu .header .icon.active {
 +        box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +        box-shadow: none;
 +        border: none; }
 +
 +.quick-settings-system-item > StBoxLayout {
 +  spacing: 12px; }
 +
 +.quick-settings-system-item .power-item {
 +  min-height: 0;
 +  min-width: 0; }
 +  .quick-settings-system-item .power-item:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%);
 +    background-color: transparent; }
 +
 +.nm-network-item .wireless-secure-icon {
 +  icon-size: 0.5455em; }
 +
 +.bt-device-item .popup-menu-icon {
 +  -st-icon-style: symbolic; }
 +
 +.bt-menu-placeholder.popup-menu-item {
 +  text-align: center;
 +  padding: 2em 4em; }
 +
 +.device-subtitle {
 +  color: rgba(255, 255, 255, 0.5); }
 +
 +.keyboard-brightness-level {
 +  spacing: 6px; }
 +
 +.background-apps-quick-toggle {
 +  min-height: 2.728em;
 +  background-color: transparent; }
 +  .background-apps-quick-toggle StIcon {
 +    icon-size: 1.091em !important; }
 +
 +.background-app-item .popup-menu-icon {
 +  icon-size: 32px !important;
 +  -st-icon-style: regular !important; }
 +
 +.background-app-item .icon-button, .background-app-item .login-dialog-button.cancel-button, .background-app-item .login-dialog-button.switch-user-button, .background-app-item .login-dialog-button.login-dialog-session-list-button, .background-app-item .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .background-app-item .pager-button, .background-app-item .message .message-header .message-expand-button, .message .message-header .background-app-item .message-expand-button,
 +.background-app-item .message .message-header .message-close-button,
 +.message .message-header .background-app-item .message-close-button, .background-app-item .screenshot-ui-show-pointer-button {
 +  padding: 6px;
 +  background-color: rgba(255, 255, 255, 0.13); }
 +  .background-app-item .icon-button:hover, .background-app-item .login-dialog-button.cancel-button:hover, .background-app-item .login-dialog-button.switch-user-button:hover, .background-app-item .login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .calendar .calendar-month-header .pager-button:hover, .calendar .calendar-month-header .background-app-item .pager-button:hover, .background-app-item .message .message-header .message-expand-button:hover, .message .message-header .background-app-item .message-expand-button:hover,
 +  .background-app-item .message .message-header .message-close-button:hover,
 +  .message .message-header .background-app-item .message-close-button:hover, .background-app-item .screenshot-ui-show-pointer-button:hover {
 +    background-color: rgba(255, 255, 255, 0.22); }
 +  .background-app-item .icon-button:active, .background-app-item .login-dialog-button.cancel-button:active, .background-app-item .login-dialog-button.switch-user-button:active, .background-app-item .login-dialog-button.login-dialog-session-list-button:active, .background-app-item .calendar .calendar-month-header .pager-button:active, .calendar .calendar-month-header .background-app-item .pager-button:active, .background-app-item .message .message-header .message-expand-button:active, .message .message-header .background-app-item .message-expand-button:active,
 +  .background-app-item .message .message-header .message-close-button:active,
 +  .message .message-header .background-app-item .message-close-button:active, .background-app-item .screenshot-ui-show-pointer-button:active {
 +    background-color: rgba(255, 255, 255, 0.31); }
 +
 +.background-app-item .spinner {
 +  padding: 6px; }
 +
 +.background-app-item.popup-inactive-menu-item {
 +  color: #ffffff; }
 +
 +/* OVERVIEW */
 +.secondary-monitor-workspaces {
 +  spacing: 12px; }
 +
 +#overviewGroup {
 +  background-color: #000000; }
 +
 +/* Window Picker */
 +.window-picker {
 +  spacing: 6px; }
 +
 +.window-icon {
 +  background-color: #000000;
 +  padding: 12px;
 +  border-radius: 16px;
 +  border: 2px solid rgba(255, 255, 255, 0.4);
 +  margin: 18px; }
 +
 +.window-close, .screenshot-ui-close-button {
 +  background-color: rgba(31, 31, 31, 0.98);
 +  color: #ffffff;
 +  border-radius: 999px;
 +  box-shadow: 0 2px 4px 0 transparent;
 +  padding: 3px;
 +  height: 32px;
 +  width: 32px;
 +  transition-duration: 100ms;
 +  border: 2px solid transparent;
 +  border-color: rgba(255, 255, 255, 0.4); }
 +  .window-close StIcon, .screenshot-ui-close-button StIcon {
 +    icon-size: 24px; }
 +  .window-close:hover, .screenshot-ui-close-button:hover {
 +    background-color: rgba(48, 48, 48, 0.98); }
 +  .window-close:active, .screenshot-ui-close-button:active {
 +    background-color: rgba(64, 64, 64, 0.98); }
 +
 +.workspace-background {
 +  border-radius: 30px;
 +  background-color: rgba(3, 2, 1, 0);
 +  box-shadow: 0 4px 16px 4px transparent; }
 +
 +.search-entry {
 +  border-radius: 999px;
 +  margin-top: 12px;
 +  margin-bottom: 6px;
 +  width: 24em; }
 +  .search-entry .search-entry-icon {
 +    icon-size: 1.091em;
 +    margin-top: 2px;
 +    padding: 0 4px; }
 +
 +/* Search */
 +#searchResults {
 +  margin: 0 4px; }
 +
 +#searchResultsContent {
 +  max-width: 1044px; }
 +
 +.search-section {
 +  spacing: 18px; }
 +  .search-section .search-section-separator {
 +    height: 8px;
 +    background-color: transparent; }
 +
 +.search-section-content {
 +  background-color: #252525;
 +  color: #ffffff;
 +  border-radius: 24px;
 +  padding: 12px;
 +  margin: 0 12px;
 +  border: 2px solid transparent;
 +  border-color: rgba(255, 255, 255, 0.4); }
 +
 +.list-search-result, .search-provider-icon {
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  color: #ffffff;
 +  background-color: #252525;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  box-shadow: none;
 +  border: none;
++  background-color: transparent;
 +  border-radius: 13.2px; }
 +  .list-search-result:focus, .search-provider-icon:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 7%), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(37, 37, 37, 0.25), 5%); }
 +    .list-search-result:focus:hover, .search-provider-icon:focus:hover {
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 7%), #ffffff, 87%), 5%); }
 +  .list-search-result:hover, .search-provider-icon:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#252525, 7%), #ffffff, 87%); }
 +  .list-search-result:active, .search-provider-icon:active {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#252525, 9%), #ffffff, 87%); }
 +    .list-search-result:active:hover, .search-provider-icon:active:hover {
 +      background-color: st-lighten(st-lighten(#252525, 9%), 7%); }
 +    .list-search-result:active:focus, .search-provider-icon:active:focus {
-       box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-       background-color: st-mix(-st-accent-color, rgba(37, 37, 37, 0.25), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); }
 +  .list-search-result:highlighted, .search-provider-icon:highlighted, .list-search-result:selected, .search-provider-icon:selected, .list-search-result:checked, .search-provider-icon:checked {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#252525, 8%), #ffffff, 87%); }
 +    .list-search-result:highlighted:hover, .search-provider-icon:highlighted:hover, .list-search-result:selected:hover, .search-provider-icon:selected:hover, .list-search-result:checked:hover, .search-provider-icon:checked:hover {
 +      background-color: st-lighten(st-lighten(#252525, 8%), 7%); }
 +    .list-search-result:highlighted:active, .search-provider-icon:highlighted:active, .list-search-result:selected:active, .search-provider-icon:selected:active, .list-search-result:checked:active, .search-provider-icon:checked:active {
 +      background-color: st-lighten(st-lighten(#252525, 8%), 9%); }
 +  .list-search-result:insensitive, .search-provider-icon:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: st-transparentize(#ffffff, 0.5);
 +    background-color: #252525;
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none; }
 +  .list-search-result:drop, .search-provider-icon:drop {
 +    background-color: st-transparentize(-st-accent-color, 0.8);
 +    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
 +
 +.search-statustext {
 +  color: rgba(255, 255, 255, 0.8); }
 +
 +.grid-search-results {
 +  spacing: 30px; }
 +
 +.search-provider-icon:ltr {
 +  margin-right: 4px; }
 +
 +.search-provider-icon:rtl {
 +  margin-left: 4px; }
 +
 +.search-provider-icon .list-search-provider-content {
 +  spacing: 12px; }
 +  .search-provider-icon .list-search-provider-content .list-search-provider-details {
 +    width: 120px;
 +    color: #ffffff; }
 +
 +.list-search-results {
 +  spacing: 6px; }
 +
 +.list-search-result .list-search-result-content {
 +  spacing: 6px; }
 +
 +.list-search-result .list-search-result-title {
 +  spacing: 12px;
 +  font-weight: bold; }
 +
 +.list-search-result .list-search-result-description {
 +  color: #868686;
 +  color: #ffffff; }
 +
 +/* Dash */
 +#dash {
 +  padding-left: 6px;
 +  padding-right: 6px; }
 +  #dash .dash-background {
 +    background-color: #252525;
 +    border-radius: 28px;
 +    padding-top: 12px;
 +    padding-bottom: 12px;
 +    padding-left: 10px;
 +    padding-right: 10px;
 +    box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.4); }
 +  #dash .dash-item-container .placeholder {
 +    background-image: none;
 +    background-size: contain;
 +    height: 32px; }
 +  #dash .dash-item-container .empty-dash-drop-target {
 +    width: 32px;
 +    height: 32px; }
 +  #dash .dash-item-container .show-apps,
 +  #dash .dash-item-container .overview-tile,
 +  #dash .dash-item-container .grid-search-result {
 +    margin: 0 2px;
 +    padding-bottom: 12px; }
 +    #dash .dash-item-container .show-apps .overview-icon,
 +    #dash .dash-item-container .overview-tile .overview-icon,
 +    #dash .dash-item-container .grid-search-result .overview-icon {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: #252525;
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      box-shadow: none;
 +      border: none; }
 +    #dash .dash-item-container .show-apps:focus .overview-icon,
 +    #dash .dash-item-container .overview-tile:focus .overview-icon,
 +    #dash .dash-item-container .grid-search-result:focus .overview-icon {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
-         background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 7%), #ffffff, 87%), 5%); }
++      box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(37, 37, 37, 0.25), 5%); }
 +      #dash .dash-item-container .show-apps:focus .overview-icon:hover,
 +      #dash .dash-item-container .overview-tile:focus .overview-icon:hover,
 +      #dash .dash-item-container .grid-search-result:focus .overview-icon:hover {
-         background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 7%), #ffffff, 87%), 5%); }
 +    #dash .dash-item-container .show-apps:hover .overview-icon,
 +    #dash .dash-item-container .overview-tile:hover .overview-icon,
 +    #dash .dash-item-container .grid-search-result:hover .overview-icon {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(#252525, 7%), #ffffff, 87%); }
 +    #dash .dash-item-container .show-apps:active .overview-icon,
 +    #dash .dash-item-container .overview-tile:active .overview-icon,
 +    #dash .dash-item-container .grid-search-result:active .overview-icon {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(#252525, 9%), #ffffff, 87%); }
 +      #dash .dash-item-container .show-apps:active .overview-icon:hover,
 +      #dash .dash-item-container .overview-tile:active .overview-icon:hover,
 +      #dash .dash-item-container .grid-search-result:active .overview-icon:hover {
 +        background-color: st-lighten(st-lighten(#252525, 9%), 7%); }
 +      #dash .dash-item-container .show-apps:active .overview-icon:focus,
 +      #dash .dash-item-container .overview-tile:active .overview-icon:focus,
 +      #dash .dash-item-container .grid-search-result:active .overview-icon:focus {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, rgba(0, 0, 0, 0.25), 5%); }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); }
 +    #dash .dash-item-container .show-apps:checked .overview-icon,
 +    #dash .dash-item-container .overview-tile:checked .overview-icon,
 +    #dash .dash-item-container .grid-search-result:checked .overview-icon {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(#252525, 8%), #ffffff, 87%); }
 +      #dash .dash-item-container .show-apps:checked .overview-icon:hover,
 +      #dash .dash-item-container .overview-tile:checked .overview-icon:hover,
 +      #dash .dash-item-container .grid-search-result:checked .overview-icon:hover {
 +        background-color: st-lighten(st-lighten(#252525, 8%), 7%); }
 +      #dash .dash-item-container .show-apps:checked .overview-icon:active,
 +      #dash .dash-item-container .overview-tile:checked .overview-icon:active,
 +      #dash .dash-item-container .grid-search-result:checked .overview-icon:active {
 +        background-color: st-lighten(st-lighten(#252525, 8%), 9%); }
 +  #dash .dash-item-container .app-grid-running-dot {
 +    offset-y: -13px; }
 +  #dash .dash-separator {
 +    width: 1px;
 +    margin-left: 4px;
 +    margin-right: 4px;
 +    background-color: rgba(255, 255, 255, 0.1);
 +    width: 2px;
 +    background-color: rgba(255, 255, 255, 0.4); }
 +  #dash .dash-separator,
 +  #dash .dash-background {
 +    margin-bottom: 12px; }
 +
 +.dash-label {
 +  -y-offset: 8px; }
 +
 +/* App Grid */
 +.icon-grid {
 +  row-spacing: 12px;
 +  column-spacing: 12px;
 +  max-row-spacing: 36px;
 +  max-column-spacing: 36px;
 +  page-padding-top: 24px;
 +  page-padding-bottom: 24px;
 +  page-padding-left: 18px;
 +  page-padding-right: 18px; }
 +
 +/* App Icons */
 +.overview-tile, .grid-search-result {
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  color: #ffffff;
 +  background-color: #000000;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  box-shadow: none;
 +  border: none;
++  background-color: transparent;
 +  border-radius: 24px;
 +  padding: 12px; }
 +  .overview-tile:focus, .grid-search-result:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(0, 0, 0, 0.25), 5%); }
 +    .overview-tile:focus:hover, .grid-search-result:focus:hover {
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
 +  .overview-tile:hover, .grid-search-result:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#000000, 7%), #ffffff, 87%); }
 +  .overview-tile:active, .grid-search-result:active {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#000000, 9%), #ffffff, 87%); }
 +    .overview-tile:active:hover, .grid-search-result:active:hover {
 +      background-color: st-lighten(st-lighten(#000000, 9%), 7%); }
 +    .overview-tile:active:focus, .grid-search-result:active:focus {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
 +  .overview-tile:highlighted, .grid-search-result:highlighted, .overview-tile:selected, .grid-search-result:selected, .overview-tile:checked, .grid-search-result:checked {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#000000, 8%), #ffffff, 87%); }
 +    .overview-tile:highlighted:hover, .grid-search-result:highlighted:hover, .overview-tile:selected:hover, .grid-search-result:selected:hover, .overview-tile:checked:hover, .grid-search-result:checked:hover {
 +      background-color: st-lighten(st-lighten(#000000, 8%), 7%); }
 +    .overview-tile:highlighted:active, .grid-search-result:highlighted:active, .overview-tile:selected:active, .grid-search-result:selected:active, .overview-tile:checked:active, .grid-search-result:checked:active {
 +      background-color: st-lighten(st-lighten(#000000, 8%), 9%); }
 +  .overview-tile:insensitive, .grid-search-result:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: st-transparentize(#ffffff, 0.5);
 +    background-color: #000000;
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none; }
 +  .overview-tile:drop, .grid-search-result:drop {
 +    background-color: st-transparentize(-st-accent-color, 0.8);
 +    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
 +  .overview-tile .overview-icon.overview-icon-with-label > StBoxLayout, .grid-search-result .overview-icon.overview-icon-with-label > StBoxLayout {
 +    spacing: 6px; }
 +
 +.app-folder {
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  color: #ffffff;
 +  background-color: st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%); }
 +  .app-folder:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%), 5%); }
 +    .app-folder:focus:hover {
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%), 5%); }
 +  .app-folder:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%); }
 +  .app-folder:active {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%); }
 +    .app-folder:active:hover {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), 4%); }
 +    .app-folder:active:focus {
-         background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #252525, 9%), 9%), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); }
 +  .app-folder:highlighted, .app-folder:selected, .app-folder:checked {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 8%), #ffffff, 87%); }
 +    .app-folder:highlighted:hover, .app-folder:selected:hover, .app-folder:checked:hover {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 8%), 4%); }
 +    .app-folder:highlighted:active, .app-folder:selected:active, .app-folder:checked:active {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 8%), 9%); }
 +  .app-folder:insensitive {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: st-transparentize(#ffffff, 0.5);
 +    background-color: st-darken(st-mix(#ffffff, #000000, 9%), 3%);
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none; }
 +  .app-folder:drop {
 +    background-color: st-transparentize(-st-accent-color, 0.8);
 +    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
 +
 +.app-grid-running-dot {
 +  height: 5px;
 +  width: 5px;
 +  border-radius: 5px;
 +  background-color: #ffffff;
 +  offset-y: 6px; }
 +
 +.app-folder-dialog-container {
 +  padding-top: 2.2em; }
 +
 +.app-folder-dialog {
 +  width: 720px;
 +  height: 720px;
 +  border-radius: 64px;
 +  background-color: #252525;
 +  color: #ffffff;
 +  padding: 0 2px;
 +  box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.4); }
 +  .app-folder-dialog .folder-name-container {
 +    padding: 24px 36px;
 +    padding-bottom: 0; }
 +    .app-folder-dialog .folder-name-container .folder-name-entry {
 +      width: 12em; }
 +  .app-folder-dialog .icon-button, .app-folder-dialog .login-dialog-button.cancel-button, .app-folder-dialog .login-dialog-button.switch-user-button, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button, .app-folder-dialog .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .app-folder-dialog .pager-button, .app-folder-dialog .message .message-header .message-expand-button, .message .message-header .app-folder-dialog .message-expand-button,
 +  .app-folder-dialog .message .message-header .message-close-button,
 +  .message .message-header .app-folder-dialog .message-close-button, .app-folder-dialog .screenshot-ui-show-pointer-button {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-mix(#ffffff, #252525, 9%), #ffffff, 87%); }
 +    .app-folder-dialog .icon-button:hover, .app-folder-dialog .login-dialog-button.cancel-button:hover, .app-folder-dialog .login-dialog-button.switch-user-button:hover, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:hover, .app-folder-dialog .calendar .calendar-month-header .pager-button:hover, .calendar .calendar-month-header .app-folder-dialog .pager-button:hover, .app-folder-dialog .message .message-header .message-expand-button:hover, .message .message-header .app-folder-dialog .message-expand-button:hover,
 +    .app-folder-dialog .message .message-header .message-close-button:hover,
 +    .message .message-header .app-folder-dialog .message-close-button:hover, .app-folder-dialog .screenshot-ui-show-pointer-button:hover {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(st-mix(#ffffff, #252525, 9%), 4%), #ffffff, 87%); }
 +    .app-folder-dialog .icon-button:active, .app-folder-dialog .login-dialog-button.cancel-button:active, .app-folder-dialog .login-dialog-button.switch-user-button:active, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active, .app-folder-dialog .calendar .calendar-month-header .pager-button:active, .calendar .calendar-month-header .app-folder-dialog .pager-button:active, .app-folder-dialog .message .message-header .message-expand-button:active, .message .message-header .app-folder-dialog .message-expand-button:active,
 +    .app-folder-dialog .message .message-header .message-close-button:active,
 +    .message .message-header .app-folder-dialog .message-close-button:active, .app-folder-dialog .screenshot-ui-show-pointer-button:active {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(st-mix(#ffffff, #252525, 9%), 9%), #ffffff, 87%); }
 +      .app-folder-dialog .icon-button:active:hover, .app-folder-dialog .login-dialog-button.cancel-button:active:hover, .app-folder-dialog .login-dialog-button.switch-user-button:active:hover, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active:hover, .app-folder-dialog .calendar .calendar-month-header .pager-button:active:hover, .calendar .calendar-month-header .app-folder-dialog .pager-button:active:hover, .app-folder-dialog .message .message-header .message-expand-button:active:hover, .message .message-header .app-folder-dialog .message-expand-button:active:hover,
 +      .app-folder-dialog .message .message-header .message-close-button:active:hover,
 +      .message .message-header .app-folder-dialog .message-close-button:active:hover, .app-folder-dialog .screenshot-ui-show-pointer-button:active:hover {
 +        background-color: st-lighten(st-lighten(st-mix(#ffffff, #252525, 9%), 9%), 4%); }
 +      .app-folder-dialog .icon-button:active:focus, .app-folder-dialog .login-dialog-button.cancel-button:active:focus, .app-folder-dialog .login-dialog-button.switch-user-button:active:focus, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active:focus, .app-folder-dialog .calendar .calendar-month-header .pager-button:active:focus, .calendar .calendar-month-header .app-folder-dialog .pager-button:active:focus, .app-folder-dialog .message .message-header .message-expand-button:active:focus, .message .message-header .app-folder-dialog .message-expand-button:active:focus,
 +      .app-folder-dialog .message .message-header .message-close-button:active:focus,
 +      .message .message-header .app-folder-dialog .message-close-button:active:focus, .app-folder-dialog .screenshot-ui-show-pointer-button:active:focus {
-         background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #252525, 9%), 9%), #ffffff, 87%), 5%); }
 +  .app-folder-dialog .page-indicators {
 +    margin-bottom: 24px; }
 +  .app-folder-dialog .page-navigation-arrow {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: #252525;
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
 +    border: none; }
 +    .app-folder-dialog .page-navigation-arrow:hover {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(#252525, 7%), #ffffff, 87%); }
 +    .app-folder-dialog .page-navigation-arrow:active {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(#252525, 9%), #ffffff, 87%); }
 +      .app-folder-dialog .page-navigation-arrow:active:hover {
 +        background-color: st-lighten(st-lighten(#252525, 9%), 7%); }
 +      .app-folder-dialog .page-navigation-arrow:active:focus {
-     border: none; }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); }
 +  .app-folder-dialog .overview-tile, .app-folder-dialog .grid-search-result {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: #252525;
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    box-shadow: none;
-       box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-       background-color: st-mix(-st-accent-color, rgba(37, 37, 37, 0.25), 5%); }
++    border: none;
++    background-color: transparent; }
 +    .app-folder-dialog .overview-tile:focus, .app-folder-dialog .grid-search-result:focus {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
-         background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 7%), #ffffff, 87%), 5%); }
++      box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(37, 37, 37, 0.25), 5%); }
 +      .app-folder-dialog .overview-tile:focus:hover, .app-folder-dialog .grid-search-result:focus:hover {
-         background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 7%), #ffffff, 87%), 5%); }
 +    .app-folder-dialog .overview-tile:hover, .app-folder-dialog .grid-search-result:hover {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(#252525, 7%), #ffffff, 87%); }
 +    .app-folder-dialog .overview-tile:active, .app-folder-dialog .grid-search-result:active {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(#252525, 9%), #ffffff, 87%); }
 +      .app-folder-dialog .overview-tile:active:hover, .app-folder-dialog .grid-search-result:active:hover {
 +        background-color: st-lighten(st-lighten(#252525, 9%), 7%); }
 +      .app-folder-dialog .overview-tile:active:focus, .app-folder-dialog .grid-search-result:active:focus {
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); }
 +    .app-folder-dialog .overview-tile:highlighted, .app-folder-dialog .grid-search-result:highlighted, .app-folder-dialog .overview-tile:selected, .app-folder-dialog .grid-search-result:selected, .app-folder-dialog .overview-tile:checked, .app-folder-dialog .grid-search-result:checked {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(#252525, 8%), #ffffff, 87%); }
 +      .app-folder-dialog .overview-tile:highlighted:hover, .app-folder-dialog .grid-search-result:highlighted:hover, .app-folder-dialog .overview-tile:selected:hover, .app-folder-dialog .grid-search-result:selected:hover, .app-folder-dialog .overview-tile:checked:hover, .app-folder-dialog .grid-search-result:checked:hover {
 +        background-color: st-lighten(st-lighten(#252525, 8%), 7%); }
 +      .app-folder-dialog .overview-tile:highlighted:active, .app-folder-dialog .grid-search-result:highlighted:active, .app-folder-dialog .overview-tile:selected:active, .app-folder-dialog .grid-search-result:selected:active, .app-folder-dialog .overview-tile:checked:active, .app-folder-dialog .grid-search-result:checked:active {
 +        background-color: st-lighten(st-lighten(#252525, 8%), 9%); }
 +    .app-folder-dialog .overview-tile:insensitive, .app-folder-dialog .grid-search-result:insensitive {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: st-transparentize(#ffffff, 0.5);
 +      background-color: #252525;
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      box-shadow: none;
 +      border: none; }
 +    .app-folder-dialog .overview-tile:drop, .app-folder-dialog .grid-search-result:drop {
 +      background-color: st-transparentize(-st-accent-color, 0.8);
 +      box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
 +
 +.rename-folder-popup .rename-folder-popup-item {
 +  spacing: 6px; }
 +  .rename-folder-popup .rename-folder-popup-item:ltr, .rename-folder-popup .rename-folder-popup-item:rtl {
 +    padding: 0 12px; }
 +
 +.page-indicator {
 +  padding: 6px 12px 0;
 +  transition-duration: 400ms; }
 +  .page-indicator .page-indicator-icon {
 +    width: 10px;
 +    height: 10px;
 +    border-radius: 999px;
 +    background-color: #ffffff;
 +    transition-duration: 400ms; }
 +
 +.apps-scroll-view {
 +  padding: 0; }
 +
 +.system-action-icon {
 +  background-color: rgba(255, 255, 255, 0.1);
 +  color: #ffffff;
 +  border-radius: 999px;
 +  icon-size: 48px;
 +  box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.4); }
 +
 +.page-navigation-hint.dnd {
 +  background: rgba(255, 255, 255, 0.1); }
 +
 +.page-navigation-hint.next:ltr, .page-navigation-hint.previous:rtl {
 +  background-gradient-start: rgba(255, 255, 255, 0.05);
 +  background-gradient-end: transparent;
 +  background-gradient-direction: horizontal;
 +  border-radius: 24px 0px 0px 24px; }
 +
 +.page-navigation-hint.previous:ltr, .page-navigation-hint.next:rtl {
 +  background-gradient-start: transparent;
 +  background-gradient-end: rgba(255, 255, 255, 0.05);
 +  background-gradient-direction: horizontal;
 +  border-radius: 0px 24px 24px 0px; }
 +
 +.page-navigation-arrow {
 +  margin: 6px;
 +  padding: 18px;
 +  width: 24px;
 +  height: 24px;
 +  border-radius: 999px;
 +  transition-duration: 100ms;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  color: #ffffff;
 +  background-color: #000000;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  box-shadow: none;
 +  border: none; }
 +  .page-navigation-arrow > StIcon {
 +    color: #ffffff; }
 +  .page-navigation-arrow:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#000000, 7%), #ffffff, 87%); }
 +  .page-navigation-arrow:active {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#000000, 9%), #ffffff, 87%); }
 +    .page-navigation-arrow:active:hover {
 +      background-color: st-lighten(st-lighten(#000000, 9%), 7%); }
 +    .page-navigation-arrow:active:focus {
-   color: #f6d32d; }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
 +
 +/* Workspace pager */
 +.workspace-thumbnails {
 +  visible-width: 32px;
 +  spacing: 6px;
 +  padding: 6px; }
 +  .workspace-thumbnails .workspace-thumbnail {
 +    color: #ffffff;
 +    background-color: #262626;
 +    border-radius: 4px;
 +    border: 1px solid transparent;
 +    border-color: rgba(255, 255, 255, 0.4); }
 +  .workspace-thumbnails .placeholder {
 +    background-image: url("resource:///org/gnome/shell/theme/workspace-placeholder.svg");
 +    background-size: contain;
 +    width: 18px; }
 +
 +.workspace-thumbnail-indicator {
 +  border: 3px solid -st-accent-color;
 +  border-radius: 8px; }
 +
 +.ripple-pointer-location {
 +  width: 50px;
 +  height: 50px;
 +  border-radius: 25px;
 +  background-color: st-lighten(st-transparentize(-st-accent-color, 0.7), 30%);
 +  box-shadow: 0 0 2px 2px st-lighten(-st-accent-color, 20%); }
 +
 +.pie-timer {
 +  width: 60px;
 +  height: 60px;
 +  -pie-border-width: 3px;
 +  -pie-border-color: -st-accent-color;
 +  -pie-background-color: st-lighten(st-transparentize(-st-accent-color, 0.7), 40%); }
 +
 +.magnifier-zoom-region {
 +  border: 2px solid -st-accent-color; }
 +  .magnifier-zoom-region.full-screen {
 +    border-width: 0; }
 +
 +.select-area-rubberband {
 +  background-color: st-transparentize(-st-accent-color, 0.7);
 +  border: 1px solid -st-accent-color; }
 +
 +.user-icon {
 +  background-size: contain;
 +  border-radius: 999px;
 +  icon-size: 64px;
 +  background-color: rgba(255, 255, 255, 0.05);
 +  color: #ffffff; }
 +  .user-icon StIcon {
 +    padding: 12px; }
 +  .user-icon.user-avatar {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1);
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); }
 +
 +.lightbox {
 +  background-color: black; }
 +
 +.flashspot {
 +  background-color: white; }
 +
 +.hidden {
 +  color: transparent; }
 +
 +.caps-lock-warning-label {
 +  text-align: center;
 +  padding-bottom: 8px;
-   min-height: 1.2em;
-   min-width: 1.2em;
-   border-width: 1px;
-   border-style: solid;
-   border-radius: 10px;
++  color: #cd9309; }
 +
 +/* Workspace animation */
 +.workspace-animation {
 +  background-color: #0d0d0d; }
 +
 +/* Tiled window previews */
 +.tile-preview {
 +  background-color: st-transparentize(-st-accent-color, 0.5);
 +  border: 1px solid -st-accent-color; }
 +
 +/* On-screen Keyboard */
 +#keyboard {
 +  background-color: #000000;
 +  box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.2); }
 +  #keyboard .page-indicator {
 +    padding: 6px; }
 +    #keyboard .page-indicator .page-indicator-icon {
 +      width: 8px;
 +      height: 8px; }
 +
 +.key-container {
 +  padding: 4px;
 +  spacing: 4px; }
 +
 +.keyboard-key {
 +  font-size: 1.455em;
 +  font-weight: bold;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); }
++  border-radius: 0.546em;
 +  box-shadow: 0 1px 0 0 transparent;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  color: #ffffff;
 +  background-color: st-mix(st-mix(#ffffff, #4d4d4d, 9%), #ffffff, 87%); }
 +  .keyboard-key:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); }
 +    .keyboard-key:focus:hover {
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); }
 +  .keyboard-key:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 4%), #ffffff, 87%); }
 +  .keyboard-key:active {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%); }
 +    .keyboard-key:active:hover {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 4%); }
 +    .keyboard-key:active:focus {
-   .keyboard-key:grayed {
-     background-color: #121212;
-     color: #ffffff;
-     border-color: rgba(255, 255, 255, 0.2); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%), 5%); }
 +  .keyboard-key:checked {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), #ffffff, 87%); }
 +    .keyboard-key:checked:hover {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 4%); }
 +    .keyboard-key:checked:active {
 +      background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 9%); }
-     border-radius: 10px; }
 +  .keyboard-key.default-key {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-mix(#ffffff, #333333, 9%), #ffffff, 87%);
-         background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #333333, 9%), 9%), #ffffff, 87%), 5%); }
++    border: none; }
 +    .keyboard-key.default-key:hover {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(st-mix(#ffffff, #333333, 9%), 4%), #ffffff, 87%); }
 +    .keyboard-key.default-key:active {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(st-mix(#ffffff, #333333, 9%), 9%), #ffffff, 87%); }
 +      .keyboard-key.default-key:active:hover {
 +        background-color: st-lighten(st-lighten(st-mix(#ffffff, #333333, 9%), 9%), 4%); }
 +      .keyboard-key.default-key:active:focus {
-       border-color: st-lighten(-st-accent-color, 5%);
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #333333, 9%), 9%), #ffffff, 87%), 5%); }
 +    .keyboard-key.default-key:checked {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(st-mix(#ffffff, #333333, 9%), 8%), #ffffff, 87%); }
 +      .keyboard-key.default-key:checked:hover {
 +        background-color: st-lighten(st-lighten(st-mix(#ffffff, #333333, 9%), 8%), 4%); }
 +      .keyboard-key.default-key:checked:active {
 +        background-color: st-lighten(st-lighten(st-mix(#ffffff, #333333, 9%), 8%), 9%); }
 +    .keyboard-key.default-key:latched {
-   .keyboard-key.enter-key {
-     box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
-     color: -st-accent-fg-color;
-     background-color: st-mix(st-mix(-st-accent-fg-color, -st-accent-color, 9%), #ffffff, 87%);
-     border-radius: 10px;
-     color: #ffffff; }
-     .keyboard-key.enter-key:hover {
-       box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
-       color: -st-accent-fg-color;
-       background-color: st-mix(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 4%), #ffffff, 87%); }
-     .keyboard-key.enter-key:active {
-       box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
-       color: -st-accent-fg-color;
-       background-color: st-mix(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 9%), #ffffff, 87%); }
-       .keyboard-key.enter-key:active:hover {
-         background-color: st-lighten(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 9%), 4%); }
-       .keyboard-key.enter-key:active:focus {
-         background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 9%), #ffffff, 87%), 5%); }
-     .keyboard-key.enter-key:checked {
-       box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
-       color: -st-accent-fg-color;
-       background-color: st-mix(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 8%), #ffffff, 87%); }
-       .keyboard-key.enter-key:checked:hover {
-         background-color: st-lighten(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 8%), 4%); }
-       .keyboard-key.enter-key:checked:active {
-         background-color: st-lighten(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 8%), 9%); }
-   .keyboard-key.shift-key-uppercase {
-     background-color: gray;
-     color: #000000; }
-     .keyboard-key.shift-key-uppercase:hover {
-       background-color: #8c8c8c;
-       color: #0d0d0d; }
 +      background-color: -st-accent-color; }
-     icon-size: 24px; }
 +  .keyboard-key StIcon {
- .keyboard-subkeys {
-   -arrow-border-radius: 16px;
++    icon-size: 1.6365em; }
 +
-   -boxpointer-gap: 6px;
-   padding: 6px; }
-   .keyboard-subkeys .keyboard-key {
-     box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
-     color: #ffffff;
-     background-color: st-mix(st-mix(#ffffff, #4d4d4d, 9%), #ffffff, 87%);
-     border-radius: 10px; }
-     .keyboard-subkeys .keyboard-key:focus {
-       box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
-       color: #ffffff;
-       box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-       background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); }
-       .keyboard-subkeys .keyboard-key:focus:hover {
-         background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); }
-     .keyboard-subkeys .keyboard-key:hover {
-       box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
-       color: #ffffff;
-       background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 4%), #ffffff, 87%); }
-     .keyboard-subkeys .keyboard-key:active {
-       box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
-       color: #ffffff;
-       background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%); }
-       .keyboard-subkeys .keyboard-key:active:hover {
-         background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 4%); }
-       .keyboard-subkeys .keyboard-key:active:focus {
-         background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%), 5%); }
-     .keyboard-subkeys .keyboard-key:checked {
-       box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
-       color: #ffffff;
-       background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), #ffffff, 87%); }
-       .keyboard-subkeys .keyboard-key:checked:hover {
-         background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 4%); }
-       .keyboard-subkeys .keyboard-key:checked:active {
-         background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 9%); }
++.keyboard-subkeys-boxpointer {
++  -arrow-border-radius: 22px;
 +  -arrow-background-color: #000000;
 +  -arrow-border-width: 1px;
 +  -arrow-border-color: #171717;
 +  -arrow-base: 20px;
 +  -arrow-rise: 10px;
-     padding: 0px 18px;
++  -boxpointer-gap: 4px;
++  border-radius: 22px;
++  box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.1); }
++  .keyboard-subkeys-boxpointer .key-container {
++    padding: 12px;
++    spacing: 8px; }
 +
 +.emoji-page .keyboard-key {
 +  background-color: transparent;
 +  border: none;
 +  color: initial; }
 +
 +.emoji-panel .keyboard-key:latched {
 +  border-color: st-lighten(-st-accent-color, 5%);
 +  background-color: -st-accent-color; }
 +
 +.word-suggestions {
 +  spacing: 12px;
 +  min-height: 17pt;
 +  padding: 12px;
 +  color: #ffffff; }
 +  .word-suggestions StButton {
 +    margin: 0 3px;
 +    min-width: 32px;
 +    border-radius: 4px;
-       box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-       background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); }
++    padding: 6px 18px;
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    background-color: transparent;
 +    border-color: transparent;
 +    box-shadow: none; }
 +    .word-suggestions StButton:insensitive {
 +      background-color: transparent !important; }
 +    .word-suggestions StButton:focus {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
-         background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); }
++      box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); }
 +      .word-suggestions StButton:focus:hover {
-         background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%), 5%); }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); }
 +    .word-suggestions StButton:hover {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 4%), #ffffff, 87%); }
 +    .word-suggestions StButton:active {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%); }
 +      .word-suggestions StButton:active:hover {
 +        background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 4%); }
 +      .word-suggestions StButton:active:focus {
-         background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%), 5%); }
 +    .word-suggestions StButton:checked {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), #ffffff, 87%); }
 +      .word-suggestions StButton:checked:hover {
 +        background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 4%); }
 +      .word-suggestions StButton:checked:active {
 +        background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 9%); }
 +
 +/* Looking Glass */
 +.lg-dialog StEntry {
 +  min-height: 1.5em; }
 +
 +.lg-dialog .shell-link {
 +  color: st-lighten(-st-accent-color, 20%); }
 +  .lg-dialog .shell-link:hover {
 +    color: st-lighten(st-lighten(-st-accent-color, 20%), 10%); }
 +  .lg-dialog .shell-link:active {
 +    color: st-darken(st-lighten(-st-accent-color, 20%), 10%); }
 +
 +.lg-dialog .actor-link {
 +  color: st-darken(#ffffff, 20%); }
 +  .lg-dialog .actor-link:hover {
 +    color: #ffffff; }
 +  .lg-dialog .actor-link:active {
 +    color: st-lighten(#ffffff, 20%); }
 +  .lg-dialog .actor-link StIcon {
 +    icon-size: 12px; }
 +
 +.lg-completions-text {
 +  font-style: italic; }
 +
 +#LookingGlassDialog {
 +  background-color: rgba(0, 0, 0, 0.98);
 +  color: #ffffff;
 +  border-radius: 16px;
 +  margin-top: 4px;
 +  border: 2px solid transparent;
 +  padding: 6px;
 +  spacing: 6px;
 +  box-shadow: 0 2px 4px 0 transparent;
 +  border-color: rgba(255, 255, 255, 0.4);
 +  background-color: #000000;
 +  box-shadow: none; }
 +  #LookingGlassDialog > #Toolbar {
 +    border: none;
 +    padding: 6px;
 +    border-radius: 0;
 +    background-color: transparent;
 +    spacing: 6px; }
 +    #LookingGlassDialog > #Toolbar .lg-toolbar-button {
 +      padding: 6px 12px; }
 +      #LookingGlassDialog > #Toolbar .lg-toolbar-button > StIcon {
 +        icon-size: 16px; }
 +  #LookingGlassDialog .labels {
 +    spacing: 6px; }
 +  #LookingGlassDialog .notebook-tab {
 +    background-color: transparent;
 +    -natural-hpadding: 12px;
 +    -minimum-hpadding: 12px;
 +    padding: 6px 12px; }
 +    #LookingGlassDialog .notebook-tab:selected {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%); }
 +      #LookingGlassDialog .notebook-tab:selected:hover {
 +        background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), 4%); }
 +      #LookingGlassDialog .notebook-tab:selected:focus {
-     color: #f6d32d; }
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); }
 +
 +#LookingGlassPropertyInspector {
 +  background-color: #000000;
 +  color: #ffffff;
 +  border-radius: 16px;
 +  border: 1px solid rgba(255, 255, 255, 0.2);
 +  padding: 12px;
 +  border-color: rgba(255, 255, 255, 0.4); }
 +  #LookingGlassPropertyInspector .lg-obj-inspector-title {
 +    spacing: 4px; }
 +  #LookingGlassPropertyInspector .lg-obj-inspector-close-button,
 +  #LookingGlassPropertyInspector .lg-obj-inspector-button {
 +    padding: 6px 12px; }
 +  #LookingGlassPropertyInspector .lg-obj-inspector-close-button {
 +    margin: 4px;
 +    padding: 6px;
 +    border-radius: 999px; }
 +    #LookingGlassPropertyInspector .lg-obj-inspector-close-button > StIcon {
 +      icon-size: 16px; }
 +
 +#LookingGlassEvaluator {
 +  padding: 6px; }
 +  #LookingGlassEvaluator .evaluator-results {
 +    spacing: 6px; }
 +
 +#LookingGlassWindows {
 +  padding: 6px;
 +  spacing: 6px; }
 +  #LookingGlassWindows .lg-window {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%);
 +    margin: 0;
 +    padding: 12px; }
 +
 +#LookingGlassExtensions .lg-extensions-list {
 +  padding: 6px;
 +  spacing: 6px; }
 +
 +#LookingGlassExtensions .lg-extension {
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  color: #ffffff;
 +  background-color: st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%);
 +  margin: 0;
 +  spacing: 4px;
 +  padding: 12px; }
 +  #LookingGlassExtensions .lg-extension .lg-extension-name {
 +    color: #ffffff !important; }
 +  #LookingGlassExtensions .lg-extension .lg-extension-meta {
 +    spacing: 12px; }
 +
 +#LookingGlassExtensions .lg-extensions-none {
 +  color: rgba(255, 255, 255, 0.5); }
 +
 +#LookingGlassActors {
 +  padding: 6px;
 +  spacing: 4px; }
 +
 +#LookingGlassDebugFlags .lg-debug-flags-header {
 +  padding: 6px;
 +  padding-top: 12px; }
 +
 +#LookingGlassDebugFlags .lg-debug-flag-button {
 +  padding: 9px 12px;
 +  margin-bottom: 6px; }
 +  #LookingGlassDebugFlags .lg-debug-flag-button StLabel {
 +    font-weight: normal !important; }
 +  #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch {
 +    background: rgba(255, 255, 255, 0.3); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:hover {
 +      background: rgba(255, 255, 255, 0.4); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:checked {
 +      background: -st-accent-color;
 +      color: -st-accent-fg-color; }
 +      #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:checked:hover {
 +        background-color: st-lighten(-st-accent-color, 5%);
 +        color: st-lighten(-st-accent-fg-color, 5%); }
 +
 +.login-dialog,
 +.unlock-dialog {
 +  color: #ffffff; }
 +  .login-dialog .caps-lock-warning-label,
 +  .login-dialog .login-dialog-message-warning,
 +  .unlock-dialog .caps-lock-warning-label,
 +  .unlock-dialog .login-dialog-message-warning {
 +    color: #ffffff; }
 +  .login-dialog .login-dialog-prompt-layout,
 +  .unlock-dialog .login-dialog-prompt-layout {
 +    width: 25em;
 +    spacing: 9px; }
 +
 +.login-dialog-button.cancel-button {
 +  padding: 9px; }
 +
 +.login-dialog-button-box {
 +  spacing: 12px; }
 +
 +.conflicting-session-dialog-content {
 +  spacing: 20px; }
 +  .conflicting-session-dialog-content .conflicting-session-dialog-title {
 +    text-align: center;
 +    margin-bottom: 5px; }
 +  .conflicting-session-dialog-content .conflicting-session-dialog-desc {
 +    text-align: center; }
 +  .conflicting-session-dialog-content .conflicting-session-dialog-desc-warning {
 +    text-align: center;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-     background-color: st-mix(-st-accent-color, rgba(0, 0, 0, 0.25), 5%); }
++    color: #cd9309; }
 +
 +.login-dialog-logo-bin {
 +  margin: 3em 0; }
 +
 +.login-dialog-banner-view {
 +  max-width: 25em; }
 +  .login-dialog-banner-view .login-dialog-banner {
 +    color: #e6e6e6; }
 +
 +.login-dialog-message {
 +  text-align: center; }
 +
 +.login-dialog-message-hint, .login-dialog-message {
 +  color: #e6e6e6;
 +  min-height: 2.75em; }
 +
 +.login-dialog-user-selection-box {
 +  padding-top: 4em;
 +  padding-bottom: 8em; }
 +
 +.login-dialog-not-listed-label {
 +  padding: 6px; }
 +
 +.login-dialog-not-listed-button {
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  color: #ffffff;
 +  background-color: #000000;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +  box-shadow: none;
 +  border: none;
 +  padding: 0 6px;
 +  margin: 6px; }
 +  .login-dialog-not-listed-button:focus {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++    background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(0, 0, 0, 0.25), 5%); }
 +    .login-dialog-not-listed-button:focus:hover {
-       background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
 +  .login-dialog-not-listed-button:hover {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#000000, 7%), #ffffff, 87%); }
 +  .login-dialog-not-listed-button:active {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +    color: #ffffff;
 +    background-color: st-mix(st-lighten(#000000, 9%), #ffffff, 87%); }
 +    .login-dialog-not-listed-button:active:hover {
 +      background-color: st-lighten(st-lighten(#000000, 9%), 7%); }
 +    .login-dialog-not-listed-button:active:focus {
-         box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
-         background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%), 5%); }
++      background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
 +
 +.login-dialog-auth-list-view {
 +  -st-vfade-offset: 3em; }
 +
 +.login-dialog-auth-list {
 +  spacing: 6px;
 +  margin-left: 2em; }
 +
 +.login-dialog-auth-list-title {
 +  margin-left: 2em; }
 +
 +.login-dialog-auth-list-item {
 +  border-radius: 16px;
 +  padding: 4px;
 +  color: #b3b3b3; }
 +  .login-dialog-auth-list-item:focus, .login-dialog-auth-list-item:selected {
 +    background-color: -st-accent-color;
 +    color: -st-accent-fg-color; }
 +
 +.login-dialog-auth-list-label:ltr {
 +  padding-left: 15px;
 +  text-align: left; }
 +
 +.login-dialog-auth-list-label:rtl {
 +  padding-right: 15px;
 +  text-align: right; }
 +
 +.login-dialog-user-list-view {
 +  width: 25em;
 +  -st-vfade-offset: 3em; }
 +  .login-dialog-user-list-view .login-dialog-user-list {
 +    margin: 0 8px;
 +    spacing: 12px; }
 +    .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item {
 +      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +      color: #ffffff;
 +      background-color: st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%);
 +      border-radius: 16px;
 +      padding: 9px; }
 +      .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:selected, .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:focus {
 +        box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +        color: #ffffff;
-           background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%), 5%); }
++        box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++        background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%), 5%); }
 +        .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:selected:hover, .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:focus:hover {
-           background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); }
++          background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%), 5%); }
 +      .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:hover {
 +        box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +        color: #ffffff;
 +        background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%); }
 +      .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active {
 +        box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
 +        color: #ffffff;
 +        background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%); }
 +        .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active:hover {
 +          background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), 4%); }
 +        .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active:focus {
++          background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); }
 +      .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item .user-icon {
 +        border: 2px solid transparent; }
 +      .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item .login-dialog-timed-login-indicator {
 +        height: 2px;
 +        margin-top: 6px;
 +        background-color: rgba(255, 255, 255, 0.7); }
 +      .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:logged-in .user-icon {
 +        border-color: -st-accent-color; }
 +        .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:logged-in .user-icon StIcon {
 +          background-color: st-transparentize(-st-accent-color, 0.7); }
 +
 +.unlock-dialog {
 +  background-color: transparent; }
 +
 +.screen-shield-background {
 +  background: black;
 +  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.6); }
 +
 +#lockDialogGroup {
 +  background-color: #000000; }
 +
 +.unlock-dialog-clock {
 +  color: #ffffff;
 +  spacing: 2em; }
 +  .unlock-dialog-clock .unlock-dialog-clock-time {
 +    font-size: 6.546em;
 +    font-weight: 800; }
 +  .unlock-dialog-clock .unlock-dialog-clock-date {
 +    font-weight: 400; }
 +  .unlock-dialog-clock .unlock-dialog-clock-hint {
 +    margin-top: 2em;
 +    padding: 6px 18px;
 +    border-radius: 16px;
 +    font-weight: bold; }
 +
 +#unlockDialogNotifications StButton#vhandle, #unlockDialogNotifications StButton#hhandle {
 +  background-color: rgba(26, 26, 26, 0.3); }
 +  #unlockDialogNotifications StButton#vhandle:hover, #unlockDialogNotifications StButton#vhandle:focus, #unlockDialogNotifications StButton#hhandle:hover, #unlockDialogNotifications StButton#hhandle:focus {
 +    background-color: rgba(26, 26, 26, 0.5); }
 +  #unlockDialogNotifications StButton#vhandle:active, #unlockDialogNotifications StButton#hhandle:active {
 +    background-color: st-transparentize(-st-accent-color, 0.5); }
 +
 +.unlock-dialog-notifications-container {
 +  margin: 12px;
 +  spacing: 6px;
 +  width: 25em;
 +  background-color: transparent; }
 +  .unlock-dialog-notifications-container .summary-notification-stack-scrollview {
 +    padding-top: 0;
 +    padding-bottom: 0; }
 +  .unlock-dialog-notifications-container .notification,
 +  .unlock-dialog-notifications-container .unlock-dialog-notification-source {
 +    padding: 12px 16px;
 +    border: none;
 +    background-color: rgba(255, 255, 255, 0.1);
 +    color: #ffffff;
 +    border-radius: 16px; }
 +    .unlock-dialog-notifications-container .notification.critical,
 +    .unlock-dialog-notifications-container .unlock-dialog-notification-source.critical {
 +      background-color: rgba(255, 255, 255, 0.2); }
 +
 +.unlock-dialog-notification-icon {
 +  icon-size: 32px; }
 +
 +.unlock-dialog-notification-label {
 +  padding-left: 12px;
 +  padding-right: 0; }
 +  .unlock-dialog-notification-label:rtl {
 +    padding-right: 12px;
 +    padding-left: 0; }
 +
 +.unlock-dialog-notification-count-text {
 +  font-weight: bold;
 +  padding: 0 12px;
 +  color: #ffffff;
 +  background-color: rgba(255, 255, 255, 0.1);
 +  border-radius: 999px; }
 +
 +.login-dialog .user-widget .user-widget-label,
 +.unlock-dialog .user-widget .user-widget-label {
 +  color: #ffffff; }
 +
 +.login-dialog .user-widget .user-icon,
 +.unlock-dialog .user-widget .user-icon {
 +  background-color: rgba(255, 255, 255, 0.13);
 +  color: #ffffff;
 +  background-color: rgba(255, 255, 255, 0.3);
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); }
 +
 +.login-dialog .user-widget.horizontal,
 +.unlock-dialog .user-widget.horizontal {
 +  spacing: 18px; }
 +
 +.login-dialog .user-widget.vertical,
 +.unlock-dialog .user-widget.vertical {
 +  spacing: 24px; }
 +  .login-dialog .user-widget.vertical .user-widget-label,
 +  .unlock-dialog .user-widget.vertical .user-widget-label {
 +    font-weight: 400;
 +    font-size: 1.818em;
 +    text-align: center;
 +    margin-bottom: .75em; }
 +  .login-dialog .user-widget.vertical .user-icon,
 +  .unlock-dialog .user-widget.vertical .user-icon {
 +    icon-size: 160px; }
 +    .login-dialog .user-widget.vertical .user-icon StIcon,
 +    .unlock-dialog .user-widget.vertical .user-icon StIcon {
 +      padding: 30px; }
index 4d522ba7cd219f8910ce4d5a721ad291f4e1504c,0000000000000000000000000000000000000000..0fd5045ab10c21698d9b6a1421f0d579e1dde7b2
mode 100644,000000..100644
--- /dev/null
@@@ -1,3236 -1,0 +1,3206 @@@
-   color: #282828; }
 +/* This stylesheet is generated, DO NOT EDIT */
 +/* Copyright 2009, 2015 Red Hat, Inc.
 + *
 + * Portions adapted from Mx's data/style/default.css
 + *   Copyright 2009 Intel Corporation
 + *
 + * This program is free software; you can redistribute it and/or modify it
 + * under the terms and conditions of the GNU Lesser General Public License,
 + * version 2.1, as published by the Free Software Foundation.
 + *
 + * This program is distributed in the hope it will be useful, but WITHOUT ANY
 + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 + * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
 + * more details.
 + *
 + * You should have received a copy of the GNU Lesser General Public License
 + * along with this program; if not, write to the Free Software Foundation,
 + * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
 + */
 +/* Global Values */
 +stage {
 +  font-size: 1em;
-   color: #282828;
-   background-color: st-mix(#282828, whitesmoke, 12%); }
++  color: #222226; }
 +
 +/* Common Stylings */
 +#dash .dash-item-container .show-apps,
 +#dash .dash-item-container .overview-tile,
 +#dash .dash-item-container .grid-search-result {
 +  background: none;
 +  box-shadow: none;
 +  border: none;
 +  border-radius: 0;
 +  padding: 0;
 +  margin: 0; }
 +
 +.app-folder-dialog .overview-tile, .app-folder-dialog .grid-search-result, .app-folder, .overview-tile, .grid-search-result, #dash .dash-item-container .show-apps .overview-icon,
 +#dash .dash-item-container .overview-tile .overview-icon,
 +#dash .dash-item-container .grid-search-result .overview-icon, .list-search-result, .search-provider-icon, .switcher-list .item-box, .audio-device-selection-dialog .audio-selection-box .audio-selection-device {
 +  border-radius: 16px;
 +  padding: 6px;
 +  spacing: 6px;
 +  text-align: center;
 +  transition-duration: 100ms; }
 +
 +.login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item, .login-dialog-not-listed-button, .unlock-dialog .button,
 +.unlock-dialog .icon-button,
 +.unlock-dialog .message .message-header .message-expand-button,
 +.message .message-header .unlock-dialog .message-expand-button,
 +.unlock-dialog .message .message-header .message-close-button,
 +.message .message-header .unlock-dialog .message-close-button,
 +.unlock-dialog .screenshot-ui-show-pointer-button, #LookingGlassDialog .notebook-tab, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button, #LookingGlassDebugFlags .lg-debug-flag-button, #LookingGlassPropertyInspector .lg-obj-inspector-close-button,
 +#LookingGlassPropertyInspector .lg-obj-inspector-button, #LookingGlassDialog > #Toolbar .lg-toolbar-button, .icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .message .message-header .message-expand-button,
 +.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button, .button {
 +  border-radius: 8px;
 +  padding: 3px 24px;
 +  font-weight: bold;
 +  transition: border-width 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), box-shadow 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94); }
 +
 +.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .screenshot-ui-show-pointer-button, .message .message-header .message-expand-button,
 +.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button, .button {
-     color: #282828;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, st-mix(#282828, whitesmoke, 12%), 5%); }
++  color: #222226;
++  background-color: st-mix(#222226, #fafafb, 12%); }
 +  .icon-button:focus, .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus, .screenshot-ui-show-pointer-button:focus, .message .message-header .message-expand-button:focus,
 +  .message .message-header .message-close-button:focus, .calendar .calendar-month-header .pager-button:focus, .button:focus {
-       background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, whitesmoke, 12%), 4%), 5%); }
++    color: #222226;
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    background-color: st-mix(-st-accent-color, st-mix(#222226, #fafafb, 12%), 5%); }
 +    .icon-button:focus:hover, .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .message .message-header .message-expand-button:focus:hover,
 +    .message .message-header .message-close-button:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .button:focus:hover {
-     color: #282828;
-     background-color: st-darken(st-mix(#282828, whitesmoke, 12%), 4%); }
++      background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #fafafb, 12%), 4%), 5%); }
 +  .icon-button:hover, .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover, .screenshot-ui-show-pointer-button:hover, .message .message-header .message-expand-button:hover,
 +  .message .message-header .message-close-button:hover, .calendar .calendar-month-header .pager-button:hover, .button:hover {
-     color: st-transparentize(#282828, 0.6);
-     background-color: st-lighten(st-mix(#282828, whitesmoke, 12%), 3%); }
++    color: #222226;
++    background-color: st-darken(st-mix(#222226, #fafafb, 12%), 4%); }
 +  .icon-button:insensitive, .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive, .screenshot-ui-show-pointer-button:insensitive, .message .message-header .message-expand-button:insensitive,
 +  .message .message-header .message-close-button:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .button:insensitive {
-     color: #282828;
-     background-color: st-darken(st-mix(#282828, whitesmoke, 12%), 9%); }
++    color: st-transparentize(#222226, 0.6);
++    background-color: st-lighten(st-mix(#222226, #fafafb, 12%), 3%); }
 +  .icon-button:selected, .login-dialog-button.cancel-button:selected, .login-dialog-button.switch-user-button:selected, .login-dialog-button.login-dialog-session-list-button:selected, .screenshot-ui-show-pointer-button:selected, .message .message-header .message-expand-button:selected,
 +  .message .message-header .message-close-button:selected, .calendar .calendar-month-header .pager-button:selected, .button:selected, .icon-button:active, .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active, .screenshot-ui-show-pointer-button:active, .message .message-header .message-expand-button:active,
 +  .message .message-header .message-close-button:active, .calendar .calendar-month-header .pager-button:active, .button:active {
-       background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 9%), 4%); }
++    color: #222226;
++    background-color: st-darken(st-mix(#222226, #fafafb, 12%), 9%); }
 +    .icon-button:selected:hover, .login-dialog-button.cancel-button:selected:hover, .login-dialog-button.switch-user-button:selected:hover, .login-dialog-button.login-dialog-session-list-button:selected:hover, .screenshot-ui-show-pointer-button:selected:hover, .message .message-header .message-expand-button:selected:hover,
 +    .message .message-header .message-close-button:selected:hover, .calendar .calendar-month-header .pager-button:selected:hover, .button:selected:hover, .icon-button:active:hover, .login-dialog-button.cancel-button:active:hover, .login-dialog-button.switch-user-button:active:hover, .login-dialog-button.login-dialog-session-list-button:active:hover, .screenshot-ui-show-pointer-button:active:hover, .message .message-header .message-expand-button:active:hover,
 +    .message .message-header .message-close-button:active:hover, .calendar .calendar-month-header .pager-button:active:hover, .button:active:hover {
-       background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, whitesmoke, 12%), 9%), 5%); }
++      background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 9%), 4%); }
 +    .icon-button:selected:focus, .login-dialog-button.cancel-button:selected:focus, .login-dialog-button.switch-user-button:selected:focus, .login-dialog-button.login-dialog-session-list-button:selected:focus, .screenshot-ui-show-pointer-button:selected:focus, .message .message-header .message-expand-button:selected:focus,
 +    .message .message-header .message-close-button:selected:focus, .calendar .calendar-month-header .pager-button:selected:focus, .button:selected:focus, .icon-button:active:focus, .login-dialog-button.cancel-button:active:focus, .login-dialog-button.switch-user-button:active:focus, .login-dialog-button.login-dialog-session-list-button:active:focus, .screenshot-ui-show-pointer-button:active:focus, .message .message-header .message-expand-button:active:focus,
 +    .message .message-header .message-close-button:active:focus, .calendar .calendar-month-header .pager-button:active:focus, .button:active:focus {
-     color: #282828;
-     background-color: st-darken(st-mix(#282828, whitesmoke, 12%), 8%); }
++      background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #fafafb, 12%), 9%), 5%); }
 +  .icon-button:checked, .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked, .screenshot-ui-show-pointer-button:checked, .message .message-header .message-expand-button:checked,
 +  .message .message-header .message-close-button:checked, .calendar .calendar-month-header .pager-button:checked, .button:checked {
-       background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 8%), 4%); }
++    color: #222226;
++    background-color: st-darken(st-mix(#222226, #fafafb, 12%), 8%); }
 +    .icon-button:checked:hover, .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .message .message-header .message-expand-button:checked:hover,
 +    .message .message-header .message-close-button:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .button:checked:hover {
-       background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 8%), 9%); }
++      background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 8%), 4%); }
 +    .icon-button:checked:active, .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active, .screenshot-ui-show-pointer-button:checked:active, .message .message-header .message-expand-button:checked:active,
 +    .message .message-header .message-close-button:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .button:checked:active {
-   color: #282828;
-   background-color: whitesmoke; }
++      background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 8%), 9%); }
 +
 +.calendar .calendar-day-heading, .calendar .calendar-day, .calendar .calendar-month-header .calendar-month-label, .icon-button.flat, .flat.login-dialog-button.cancel-button, .flat.login-dialog-button.switch-user-button, .flat.login-dialog-button.login-dialog-session-list-button, .flat.screenshot-ui-show-pointer-button, .message .message-header .flat.message-expand-button,
 +.message .message-header .flat.message-close-button, .calendar .calendar-month-header .pager-button, .button.flat {
-     color: #282828;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.25), 5%); }
++  color: #222226;
++  background-color: #fafafb; }
 +  .calendar .calendar-day-heading:focus, .calendar .calendar-day:focus, .calendar .calendar-month-header .calendar-month-label:focus, .icon-button.flat:focus, .flat.login-dialog-button.cancel-button:focus, .flat.login-dialog-button.switch-user-button:focus, .flat.login-dialog-button.login-dialog-session-list-button:focus, .flat.screenshot-ui-show-pointer-button:focus, .message .message-header .flat.message-expand-button:focus,
 +  .message .message-header .flat.message-close-button:focus, .calendar .calendar-month-header .pager-button:focus, .button.flat:focus {
-       background-color: st-mix(-st-accent-color, st-darken(whitesmoke, 7%), 5%); }
++    color: #222226;
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    background-color: st-mix(-st-accent-color, rgba(250, 250, 251, 0.25), 5%); }
 +    .calendar .calendar-day-heading:focus:hover, .calendar .calendar-day:focus:hover, .calendar .calendar-month-header .calendar-month-label:focus:hover, .icon-button.flat:focus:hover, .flat.login-dialog-button.cancel-button:focus:hover, .flat.login-dialog-button.switch-user-button:focus:hover, .flat.login-dialog-button.login-dialog-session-list-button:focus:hover, .flat.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .flat.message-expand-button:focus:hover,
 +    .message .message-header .flat.message-close-button:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .button.flat:focus:hover {
-     color: #282828;
-     background-color: st-darken(whitesmoke, 7%); }
++      background-color: st-mix(-st-accent-color, st-darken(#fafafb, 7%), 5%); }
 +  .calendar .calendar-day-heading:hover, .calendar .calendar-day:hover, .calendar .calendar-month-header .calendar-month-label:hover, .icon-button.flat:hover, .flat.login-dialog-button.cancel-button:hover, .flat.login-dialog-button.switch-user-button:hover, .flat.login-dialog-button.login-dialog-session-list-button:hover, .flat.screenshot-ui-show-pointer-button:hover, .message .message-header .flat.message-expand-button:hover,
 +  .message .message-header .flat.message-close-button:hover, .calendar .calendar-month-header .pager-button:hover, .button.flat:hover {
-     color: st-transparentize(#282828, 0.6);
-     background-color: whitesmoke; }
++    color: #222226;
++    background-color: st-darken(#fafafb, 7%); }
 +  .calendar .calendar-day-heading:insensitive, .calendar .calendar-day:insensitive, .calendar .calendar-month-header .calendar-month-label:insensitive, .icon-button.flat:insensitive, .flat.login-dialog-button.cancel-button:insensitive, .flat.login-dialog-button.switch-user-button:insensitive, .flat.login-dialog-button.login-dialog-session-list-button:insensitive, .flat.screenshot-ui-show-pointer-button:insensitive, .message .message-header .flat.message-expand-button:insensitive,
 +  .message .message-header .flat.message-close-button:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .button.flat:insensitive {
-     color: #282828;
-     background-color: st-darken(whitesmoke, 9%); }
++    color: st-transparentize(#222226, 0.6);
++    background-color: #fafafb; }
 +  .calendar .calendar-day-heading:selected, .calendar .calendar-day:selected, .calendar .calendar-month-header .calendar-month-label:selected, .icon-button.flat:selected, .flat.login-dialog-button.cancel-button:selected, .flat.login-dialog-button.switch-user-button:selected, .flat.login-dialog-button.login-dialog-session-list-button:selected, .flat.screenshot-ui-show-pointer-button:selected, .message .message-header .flat.message-expand-button:selected,
 +  .message .message-header .flat.message-close-button:selected, .calendar .calendar-month-header .pager-button:selected, .button.flat:selected, .calendar .calendar-day-heading:active, .calendar .calendar-day:active, .calendar .calendar-month-header .calendar-month-label:active, .icon-button.flat:active, .flat.login-dialog-button.cancel-button:active, .flat.login-dialog-button.switch-user-button:active, .flat.login-dialog-button.login-dialog-session-list-button:active, .flat.screenshot-ui-show-pointer-button:active, .message .message-header .flat.message-expand-button:active,
 +  .message .message-header .flat.message-close-button:active, .calendar .calendar-month-header .pager-button:active, .button.flat:active {
-       background-color: st-darken(st-darken(whitesmoke, 9%), 7%); }
++    color: #222226;
++    background-color: st-darken(#fafafb, 9%); }
 +    .calendar .calendar-day-heading:selected:hover, .calendar .calendar-day:selected:hover, .calendar .calendar-month-header .calendar-month-label:selected:hover, .icon-button.flat:selected:hover, .flat.login-dialog-button.cancel-button:selected:hover, .flat.login-dialog-button.switch-user-button:selected:hover, .flat.login-dialog-button.login-dialog-session-list-button:selected:hover, .flat.screenshot-ui-show-pointer-button:selected:hover, .message .message-header .flat.message-expand-button:selected:hover,
 +    .message .message-header .flat.message-close-button:selected:hover, .calendar .calendar-month-header .pager-button:selected:hover, .button.flat:selected:hover, .calendar .calendar-day-heading:active:hover, .calendar .calendar-day:active:hover, .calendar .calendar-month-header .calendar-month-label:active:hover, .icon-button.flat:active:hover, .flat.login-dialog-button.cancel-button:active:hover, .flat.login-dialog-button.switch-user-button:active:hover, .flat.login-dialog-button.login-dialog-session-list-button:active:hover, .flat.screenshot-ui-show-pointer-button:active:hover, .message .message-header .flat.message-expand-button:active:hover,
 +    .message .message-header .flat.message-close-button:active:hover, .calendar .calendar-month-header .pager-button:active:hover, .button.flat:active:hover {
-       background-color: st-mix(-st-accent-color, st-darken(whitesmoke, 9%), 5%); }
++      background-color: st-darken(st-darken(#fafafb, 9%), 7%); }
 +    .calendar .calendar-day-heading:selected:focus, .calendar .calendar-day:selected:focus, .calendar .calendar-month-header .calendar-month-label:selected:focus, .icon-button.flat:selected:focus, .flat.login-dialog-button.cancel-button:selected:focus, .flat.login-dialog-button.switch-user-button:selected:focus, .flat.login-dialog-button.login-dialog-session-list-button:selected:focus, .flat.screenshot-ui-show-pointer-button:selected:focus, .message .message-header .flat.message-expand-button:selected:focus,
 +    .message .message-header .flat.message-close-button:selected:focus, .calendar .calendar-month-header .pager-button:selected:focus, .button.flat:selected:focus, .calendar .calendar-day-heading:active:focus, .calendar .calendar-day:active:focus, .calendar .calendar-month-header .calendar-month-label:active:focus, .icon-button.flat:active:focus, .flat.login-dialog-button.cancel-button:active:focus, .flat.login-dialog-button.switch-user-button:active:focus, .flat.login-dialog-button.login-dialog-session-list-button:active:focus, .flat.screenshot-ui-show-pointer-button:active:focus, .message .message-header .flat.message-expand-button:active:focus,
 +    .message .message-header .flat.message-close-button:active:focus, .calendar .calendar-month-header .pager-button:active:focus, .button.flat:active:focus {
-     color: #282828;
-     background-color: st-darken(whitesmoke, 8%); }
++      background-color: st-mix(-st-accent-color, st-darken(#fafafb, 9%), 5%); }
 +  .calendar .calendar-day-heading:checked, .calendar .calendar-day:checked, .calendar .calendar-month-header .calendar-month-label:checked, .icon-button.flat:checked, .flat.login-dialog-button.cancel-button:checked, .flat.login-dialog-button.switch-user-button:checked, .flat.login-dialog-button.login-dialog-session-list-button:checked, .flat.screenshot-ui-show-pointer-button:checked, .message .message-header .flat.message-expand-button:checked,
 +  .message .message-header .flat.message-close-button:checked, .calendar .calendar-month-header .pager-button:checked, .button.flat:checked {
-       background-color: st-darken(st-darken(whitesmoke, 8%), 7%); }
++    color: #222226;
++    background-color: st-darken(#fafafb, 8%); }
 +    .calendar .calendar-day-heading:checked:hover, .calendar .calendar-day:checked:hover, .calendar .calendar-month-header .calendar-month-label:checked:hover, .icon-button.flat:checked:hover, .flat.login-dialog-button.cancel-button:checked:hover, .flat.login-dialog-button.switch-user-button:checked:hover, .flat.login-dialog-button.login-dialog-session-list-button:checked:hover, .flat.screenshot-ui-show-pointer-button:checked:hover, .message .message-header .flat.message-expand-button:checked:hover,
 +    .message .message-header .flat.message-close-button:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .button.flat:checked:hover {
-       background-color: st-darken(st-darken(whitesmoke, 8%), 9%); }
++      background-color: st-darken(st-darken(#fafafb, 8%), 7%); }
 +    .calendar .calendar-day-heading:checked:active, .calendar .calendar-day:checked:active, .calendar .calendar-month-header .calendar-month-label:checked:active, .icon-button.flat:checked:active, .flat.login-dialog-button.cancel-button:checked:active, .flat.login-dialog-button.switch-user-button:checked:active, .flat.login-dialog-button.login-dialog-session-list-button:checked:active, .flat.screenshot-ui-show-pointer-button:checked:active, .message .message-header .flat.message-expand-button:checked:active,
 +    .message .message-header .flat.message-close-button:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .button.flat:checked:active {
- .keyboard-brightness-level .button:checked, .quick-menu-toggle .quick-toggle-arrow:checked, .quick-toggle:checked, .calendar .calendar-day.calendar-today, .icon-button.default, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .default.screenshot-ui-show-pointer-button, .message .message-header .default.message-expand-button,
++      background-color: st-darken(st-darken(#fafafb, 8%), 9%); }
 +
-   .keyboard-brightness-level .button:focus:checked, .quick-menu-toggle .quick-toggle-arrow:focus:checked, .quick-toggle:focus:checked, .calendar .calendar-day.calendar-today:focus, .icon-button.default:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .default.screenshot-ui-show-pointer-button:focus, .message .message-header .default.message-expand-button:focus,
++.keyboard-brightness-level .button:checked, .quick-toggle:checked, .calendar .calendar-day.calendar-today, .icon-button.default, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .default.screenshot-ui-show-pointer-button, .message .message-header .default.message-expand-button,
 +.message .message-header .default.message-close-button, .calendar .calendar-month-header .default.pager-button, .button.default {
 +  color: -st-accent-fg-color;
 +  background-color: -st-accent-color; }
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     box-shadow: inset 0 0 0 2px st-darken(-st-accent-color, 15%) !important;
++  .keyboard-brightness-level .button:focus:checked, .quick-toggle:focus:checked, .calendar .calendar-day.calendar-today:focus, .icon-button.default:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .default.screenshot-ui-show-pointer-button:focus, .message .message-header .default.message-expand-button:focus,
 +  .message .message-header .default.message-close-button:focus, .calendar .calendar-month-header .default.pager-button:focus, .button.default:focus {
 +    color: -st-accent-fg-color;
-     .keyboard-brightness-level .button:focus:hover:checked, .quick-menu-toggle .quick-toggle-arrow:focus:hover:checked, .quick-toggle:focus:hover:checked, .calendar .calendar-day.calendar-today:focus:hover, .icon-button.default:focus:hover, .default.login-dialog-button.cancel-button:focus:hover, .default.login-dialog-button.switch-user-button:focus:hover, .default.login-dialog-button.login-dialog-session-list-button:focus:hover, .default.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .default.message-expand-button:focus:hover,
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    box-shadow: inset 0 0 0 2px st-transparentize(st-darken(-st-accent-color, 20%), 0.2) !important;
 +    background-color: st-mix(-st-accent-color, -st-accent-color, 5%); }
-   .keyboard-brightness-level .button:hover:checked, .quick-menu-toggle .quick-toggle-arrow:hover:checked, .quick-toggle:hover:checked, .calendar .calendar-day.calendar-today:hover, .icon-button.default:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .default.screenshot-ui-show-pointer-button:hover, .message .message-header .default.message-expand-button:hover,
++    .keyboard-brightness-level .button:focus:hover:checked, .quick-toggle:focus:hover:checked, .calendar .calendar-day.calendar-today:focus:hover, .icon-button.default:focus:hover, .default.login-dialog-button.cancel-button:focus:hover, .default.login-dialog-button.switch-user-button:focus:hover, .default.login-dialog-button.login-dialog-session-list-button:focus:hover, .default.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .default.message-expand-button:focus:hover,
 +    .message .message-header .default.message-close-button:focus:hover, .calendar .calendar-month-header .default.pager-button:focus:hover, .button.default:focus:hover {
 +      background-color: st-mix(-st-accent-color, st-darken(-st-accent-color, 4%), 5%); }
-   .keyboard-brightness-level .button:insensitive:checked, .quick-menu-toggle .quick-toggle-arrow:insensitive:checked, .quick-toggle:insensitive:checked, .calendar .calendar-day.calendar-today:insensitive, .icon-button.default:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .default.screenshot-ui-show-pointer-button:insensitive, .message .message-header .default.message-expand-button:insensitive,
++  .keyboard-brightness-level .button:hover:checked, .quick-toggle:hover:checked, .calendar .calendar-day.calendar-today:hover, .icon-button.default:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .default.screenshot-ui-show-pointer-button:hover, .message .message-header .default.message-expand-button:hover,
 +  .message .message-header .default.message-close-button:hover, .calendar .calendar-month-header .default.pager-button:hover, .button.default:hover {
 +    color: -st-accent-fg-color;
 +    background-color: st-darken(-st-accent-color, 4%); }
-   .keyboard-brightness-level .button:active:checked, .quick-menu-toggle .quick-toggle-arrow:active:checked, .quick-toggle:active:checked, .calendar .calendar-day.calendar-today:active, .icon-button.default:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .default.screenshot-ui-show-pointer-button:active, .message .message-header .default.message-expand-button:active,
++  .keyboard-brightness-level .button:insensitive:checked, .quick-toggle:insensitive:checked, .calendar .calendar-day.calendar-today:insensitive, .icon-button.default:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .default.screenshot-ui-show-pointer-button:insensitive, .message .message-header .default.message-expand-button:insensitive,
 +  .message .message-header .default.message-close-button:insensitive, .calendar .calendar-month-header .default.pager-button:insensitive, .button.default:insensitive {
 +    color: st-transparentize(-st-accent-fg-color, 0.6);
 +    background-color: st-lighten(-st-accent-color, 3%); }
-     .keyboard-brightness-level .button:active:hover:checked, .quick-menu-toggle .quick-toggle-arrow:active:hover:checked, .quick-toggle:active:hover:checked, .calendar .calendar-day.calendar-today:active:hover, .icon-button.default:active:hover, .default.login-dialog-button.cancel-button:active:hover, .default.login-dialog-button.switch-user-button:active:hover, .default.login-dialog-button.login-dialog-session-list-button:active:hover, .default.screenshot-ui-show-pointer-button:active:hover, .message .message-header .default.message-expand-button:active:hover,
++  .keyboard-brightness-level .button:active:checked, .quick-toggle:active:checked, .calendar .calendar-day.calendar-today:active, .icon-button.default:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .default.screenshot-ui-show-pointer-button:active, .message .message-header .default.message-expand-button:active,
 +  .message .message-header .default.message-close-button:active, .calendar .calendar-month-header .default.pager-button:active, .button.default:active {
 +    color: -st-accent-fg-color;
 +    background-color: st-darken(-st-accent-color, 9%); }
-     .keyboard-brightness-level .button:active:focus:checked, .quick-menu-toggle .quick-toggle-arrow:active:focus:checked, .quick-toggle:active:focus:checked, .calendar .calendar-day.calendar-today:active:focus, .icon-button.default:active:focus, .default.login-dialog-button.cancel-button:active:focus, .default.login-dialog-button.switch-user-button:active:focus, .default.login-dialog-button.login-dialog-session-list-button:active:focus, .default.screenshot-ui-show-pointer-button:active:focus, .message .message-header .default.message-expand-button:active:focus,
++    .keyboard-brightness-level .button:active:hover:checked, .quick-toggle:active:hover:checked, .calendar .calendar-day.calendar-today:active:hover, .icon-button.default:active:hover, .default.login-dialog-button.cancel-button:active:hover, .default.login-dialog-button.switch-user-button:active:hover, .default.login-dialog-button.login-dialog-session-list-button:active:hover, .default.screenshot-ui-show-pointer-button:active:hover, .message .message-header .default.message-expand-button:active:hover,
 +    .message .message-header .default.message-close-button:active:hover, .calendar .calendar-month-header .default.pager-button:active:hover, .button.default:active:hover {
 +      background-color: st-darken(st-darken(-st-accent-color, 9%), 4%); }
-   color: #282828;
++    .keyboard-brightness-level .button:active:focus:checked, .quick-toggle:active:focus:checked, .calendar .calendar-day.calendar-today:active:focus, .icon-button.default:active:focus, .default.login-dialog-button.cancel-button:active:focus, .default.login-dialog-button.switch-user-button:active:focus, .default.login-dialog-button.login-dialog-session-list-button:active:focus, .default.screenshot-ui-show-pointer-button:active:focus, .message .message-header .default.message-expand-button:active:focus,
 +    .message .message-header .default.message-close-button:active:focus, .calendar .calendar-month-header .default.pager-button:active:focus, .button.default:active:focus {
 +      background-color: st-mix(-st-accent-color, st-darken(-st-accent-color, 9%), 5%); }
 +
 +.popup-sub-menu .popup-menu-item, .popup-menu-item {
 +  font-weight: normal;
 +  spacing: 6px;
 +  transition-duration: 100ms;
 +  padding: 9px 12px; }
 +
 +#LookingGlassExtensions .lg-extension, #LookingGlassWindows .lg-window, .calendar, .datemenu-today-button, .quick-toggle-menu, .message, .events-button,
 +.world-clocks-button,
 +.weather-button {
 +  border-radius: 12px;
 +  padding: 0.818em;
 +  margin: 4px;
 +  background-color: #ffffff;
 +  box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.03);
 +  border: 1px solid rgba(0, 0, 0, 0.09); }
 +
 +.quick-toggle-menu, .message, .events-button,
 +.world-clocks-button,
 +.weather-button {
-     color: #282828;
++  color: #222226;
 +  background-color: #ffffff; }
 +  .quick-toggle-menu:hover, .message:hover, .events-button:hover,
 +  .world-clocks-button:hover,
 +  .weather-button:hover {
-     color: #282828;
++    color: #222226;
 +    background-color: st-darken(#ffffff, 4%); }
 +  .quick-toggle-menu:active, .message:active, .events-button:active,
 +  .world-clocks-button:active,
 +  .weather-button:active {
-     color: #282828;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
++    color: #222226;
 +    background-color: st-darken(#ffffff, 9%); }
 +    .quick-toggle-menu:active:hover, .message:active:hover, .events-button:active:hover,
 +    .world-clocks-button:active:hover,
 +    .weather-button:active:hover {
 +      background-color: st-darken(st-darken(#ffffff, 9%), 4%); }
 +    .quick-toggle-menu:active:focus, .message:active:focus, .events-button:active:focus,
 +    .world-clocks-button:active:focus,
 +    .weather-button:active:focus {
 +      background-color: st-mix(-st-accent-color, st-darken(#ffffff, 9%), 5%); }
 +  .quick-toggle-menu:focus, .message:focus, .events-button:focus,
 +  .world-clocks-button:focus,
 +  .weather-button:focus {
-     color: st-transparentize(#282828, 0.6);
++    color: #222226;
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
 +    background-color: st-mix(-st-accent-color, #ffffff, 5%); }
 +    .quick-toggle-menu:focus:hover, .message:focus:hover, .events-button:focus:hover,
 +    .world-clocks-button:focus:hover,
 +    .weather-button:focus:hover {
 +      background-color: st-mix(-st-accent-color, st-darken(#ffffff, 4%), 5%); }
 +  .quick-toggle-menu:insensitive, .message:insensitive, .events-button:insensitive,
 +  .world-clocks-button:insensitive,
 +  .weather-button:insensitive {
-     color: #282828;
-     background-color: st-darken(whitesmoke, 7%); }
++    color: st-transparentize(#222226, 0.6);
 +    background-color: st-lighten(#ffffff, 3%); }
 +
 +.calendar, .datemenu-today-button {
 +  border: 1px solid transparent !important;
 +  background-color: transparent;
 +  border-color: transparent;
 +  box-shadow: none; }
 +  .calendar:insensitive, .datemenu-today-button:insensitive {
 +    background-color: transparent !important; }
 +  .calendar:hover, .datemenu-today-button:hover {
-     color: #282828;
-     background-color: st-darken(whitesmoke, 9%); }
++    color: #222226;
++    background-color: st-darken(#fafafb, 7%); }
 +  .calendar:active, .datemenu-today-button:active {
-       background-color: st-darken(st-darken(whitesmoke, 9%), 7%); }
++    color: #222226;
++    background-color: st-darken(#fafafb, 9%); }
 +    .calendar:active:hover, .datemenu-today-button:active:hover {
-       background-color: st-mix(-st-accent-color, st-darken(whitesmoke, 9%), 5%); }
++      background-color: st-darken(st-darken(#fafafb, 9%), 7%); }
 +    .calendar:active:focus, .datemenu-today-button:active:focus {
-     color: #282828;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
++      background-color: st-mix(-st-accent-color, st-darken(#fafafb, 9%), 5%); }
 +  .calendar:focus, .datemenu-today-button:focus {
-     color: st-transparentize(#282828, 0.6);
++    color: #222226;
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
 +    background-color: st-mix(-st-accent-color, #ffffff, 5%); }
 +    .calendar:focus:hover, .datemenu-today-button:focus:hover {
 +      background-color: st-mix(-st-accent-color, st-darken(#ffffff, 4%), 5%); }
 +  .calendar:insensitive, .datemenu-today-button:insensitive {
-   selected-color: #282828; }
++    color: st-transparentize(#222226, 0.6);
 +    background-color: st-lighten(#ffffff, 3%); }
 +
 +.unlock-dialog .login-dialog-prompt-entry, .login-dialog .login-dialog-prompt-entry, .app-folder-dialog .folder-name-container .folder-name-entry, .search-entry, .lg-dialog StEntry, StEntry {
 +  border-radius: 8px;
 +  padding: 9px 9px;
 +  selection-background-color: st-transparentize(-st-accent-color, 0.7);
-   background-color: gainsboro;
-   color: rgba(40, 40, 40, 0.7); }
++  selected-color: #222226; }
 +
 +StEntry {
-     background-color: #d2d2d2;
-     color: #282828; }
++  background-color: #e0e0e1;
++  color: rgba(34, 34, 38, 0.7); }
 +  StEntry:hover {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, gainsboro, 5%);
-     color: #282828; }
++    background-color: #d6d6d7;
++    color: #222226; }
 +  StEntry:focus {
-     background-color: #e4e4e4;
-     color: rgba(40, 40, 40, 0.5); }
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    background-color: st-mix(-st-accent-color, #e0e0e1, 5%);
++    color: #222226; }
 +  StEntry:insensitive {
-     color: rgba(40, 40, 40, 0.7); }
++    background-color: #e8e8e9;
++    color: rgba(34, 34, 38, 0.5); }
 +  StEntry StLabel.hint-text {
-   color: #282828;
-   background-color: rgba(40, 40, 40, 0.15); }
++    color: rgba(34, 34, 38, 0.7); }
 +
 +.notification-button, .message .message-header .message-expand-button,
 +.message .message-header .message-close-button {
 +  font-weight: bold;
 +  padding: 6px 12px;
 +  border-radius: 8px;
-     color: #282828;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.15), 5%); }
++  color: #222226;
++  background-color: rgba(34, 34, 38, 0.15); }
 +  .notification-button:focus, .message .message-header .message-expand-button:focus,
 +  .message .message-header .message-close-button:focus {
-       background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.3), 5%); }
++    color: #222226;
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.15), 5%); }
 +    .notification-button:focus:hover, .message .message-header .message-expand-button:focus:hover,
 +    .message .message-header .message-close-button:focus:hover {
-     color: #282828;
-     background-color: rgba(40, 40, 40, 0.3); }
++      background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.3), 5%); }
 +  .notification-button:hover, .message .message-header .message-expand-button:hover,
 +  .message .message-header .message-close-button:hover {
-     color: #282828;
-     background-color: rgba(40, 40, 40, 0.2); }
++    color: #222226;
++    background-color: rgba(34, 34, 38, 0.3); }
 +  .notification-button:active, .message .message-header .message-expand-button:active,
 +  .message .message-header .message-close-button:active {
-       background-color: rgba(40, 40, 40, 0.2); }
++    color: #222226;
++    background-color: rgba(34, 34, 38, 0.2); }
 +    .notification-button:active:hover, .message .message-header .message-expand-button:active:hover,
 +    .message .message-header .message-close-button:active:hover {
-       background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.2), 5%); }
++      background-color: rgba(34, 34, 38, 0.2); }
 +    .notification-button:active:focus, .message .message-header .message-expand-button:active:focus,
 +    .message .message-header .message-close-button:active:focus {
-     color: #282828;
-     background-color: st-darken(st-mix(#282828, whitesmoke, 12%), 8%); }
++      background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.2), 5%); }
 +  .notification-button:checked, .message .message-header .message-expand-button:checked,
 +  .message .message-header .message-close-button:checked {
-       background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 8%), 4%); }
++    color: #222226;
++    background-color: st-darken(st-mix(#222226, #fafafb, 12%), 8%); }
 +    .notification-button:checked:hover, .message .message-header .message-expand-button:checked:hover,
 +    .message .message-header .message-close-button:checked:hover {
-       background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 8%), 9%); }
++      background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 8%), 4%); }
 +    .notification-button:checked:active, .message .message-header .message-expand-button:checked:active,
 +    .message .message-header .message-close-button:checked:active {
-     color: st-transparentize(#282828, 0.6);
-     background-color: rgba(40, 40, 40, 0.1); }
++      background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 8%), 9%); }
 +  .notification-button:insensitive, .message .message-header .message-expand-button:insensitive,
 +  .message .message-header .message-close-button:insensitive {
-   color: #282828;
-   background-color: rgba(40, 40, 40, 0.1); }
++    color: st-transparentize(#222226, 0.6);
++    background-color: rgba(34, 34, 38, 0.1); }
 +
 +.modal-dialog .modal-dialog-button-box .modal-dialog-button {
 +  font-weight: bold;
 +  padding: 12px;
 +  border-radius: 12px;
-     color: #282828;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.1), 5%); }
++  color: #222226;
++  background-color: rgba(34, 34, 38, 0.1); }
 +  .modal-dialog .modal-dialog-button-box .modal-dialog-button:focus {
-       background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.13), 5%); }
++    color: #222226;
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.1), 5%); }
 +    .modal-dialog .modal-dialog-button-box .modal-dialog-button:focus:hover {
-     color: #282828;
-     background-color: rgba(40, 40, 40, 0.13); }
++      background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.13), 5%); }
 +  .modal-dialog .modal-dialog-button-box .modal-dialog-button:hover {
-     color: #282828;
-     background-color: rgba(40, 40, 40, 0.16); }
++    color: #222226;
++    background-color: rgba(34, 34, 38, 0.13); }
 +  .modal-dialog .modal-dialog-button-box .modal-dialog-button:active {
-       background-color: rgba(40, 40, 40, 0.19); }
++    color: #222226;
++    background-color: rgba(34, 34, 38, 0.16); }
 +    .modal-dialog .modal-dialog-button-box .modal-dialog-button:active:hover {
-       background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.16), 5%); }
++      background-color: rgba(34, 34, 38, 0.19); }
 +    .modal-dialog .modal-dialog-button-box .modal-dialog-button:active:focus {
-     color: #282828;
-     background-color: st-darken(st-mix(#282828, whitesmoke, 12%), 8%); }
++      background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.16), 5%); }
 +  .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked {
-       background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 8%), 4%); }
++    color: #222226;
++    background-color: st-darken(st-mix(#222226, #fafafb, 12%), 8%); }
 +    .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked:hover {
-       background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 8%), 9%); }
++      background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 8%), 4%); }
 +    .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked:active {
-     color: st-transparentize(#282828, 0.6);
-     background-color: st-lighten(st-mix(#282828, whitesmoke, 12%), 3%); }
++      background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 8%), 9%); }
 +  .modal-dialog .modal-dialog-button-box .modal-dialog-button:insensitive {
- .conflicting-session-dialog-content .conflicting-session-dialog-title, .message-dialog-content .message-dialog-title, .message-list .message-list-placeholder, .datemenu-today-button .date-label {
++    color: st-transparentize(#222226, 0.6);
++    background-color: st-lighten(st-mix(#222226, #fafafb, 12%), 3%); }
 +
 +.dash-label, .window-caption, .screenshot-ui-tooltip {
 +  background-color: rgba(0, 0, 0, 0.9);
 +  border: 1px solid rgba(255, 255, 255, 0.1);
 +  color: #ffffff;
 +  border-radius: 999px;
 +  padding: 6px 12px;
 +  text-align: center; }
 +
 +/* General Typography */
 +.unlock-dialog-clock .unlock-dialog-clock-date, .app-folder-dialog .folder-name-container .folder-name-label, .app-folder-dialog .folder-name-container .folder-name-entry, .search-statustext {
 +  font-weight: 800;
 +  font-size: 1.818em; }
 +
- .unlock-dialog .user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title {
++.conflicting-session-dialog-content .conflicting-session-dialog-title, .message-dialog-content .message-dialog-title, .datemenu-today-button .date-label {
 +  font-weight: 800;
 +  font-size: 1.364em; }
 +
 +.login-dialog .user-widget.horizontal .user-widget-label,
- .login-dialog-not-listed-label, #LookingGlassExtensions .lg-extension .lg-extension-name, #LookingGlassWindows .lg-window .lg-window-name, #LookingGlassPropertyInspector .lg-obj-inspector-title, .background-app-item .title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-box .weather-header-box .weather-header, .world-clocks-button .world-clocks-header, .events-button .events-box .events-list .event-box .event-summary, .events-button .events-box .events-title, .calendar .calendar-month-header .calendar-month-label {
++.unlock-dialog .user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title, .message-list .message-list-placeholder {
 +  font-weight: 700;
 +  font-size: 1.364em; }
 +
 +.login-dialog-auth-list-label, #LookingGlassDebugFlags .lg-debug-flags-header, #LookingGlassExtensions .lg-extensions-none, .word-suggestions, .bt-menu-placeholder.popup-menu-item, .restart-message, .polkit-dialog-user-layout .polkit-dialog-user-label,
 +.polkit-dialog-user-layout .polkit-dialog-user-root-label, .message-dialog-content .message-dialog-title.lightweight {
 +  font-weight: 700;
 +  font-size: 1.182em; }
 +
- .lg-completions-text, .caps-lock-warning-label, .background-app-item .subtitle, .quick-toggle StBoxLayout > .quick-toggle-subtitle, .screenshot-ui-type-button .icon-label-button-container, .prompt-dialog .prompt-dialog-error-label,
++.login-dialog-not-listed-label, #LookingGlassExtensions .lg-extension .lg-extension-name, #LookingGlassWindows .lg-window .lg-window-name, #LookingGlassPropertyInspector .lg-obj-inspector-title, .background-app-item .title, .quick-toggle .quick-toggle-title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-box .weather-header-box .weather-header, .world-clocks-button .world-clocks-header, .events-button .events-box .events-list .event-box .event-summary, .events-button .events-box .events-title, .calendar .calendar-month-header .calendar-month-label {
 +  font-weight: 700;
 +  font-size: 1em; }
 +
 +.quick-toggle-menu .header .subtitle, .app-menu .popup-inactive-menu-item:first-child > StLabel {
 +  font-weight: 700;
 +  font-size: 0.818em; }
 +
-   background-color: #353535;
++.lg-completions-text, .caps-lock-warning-label, .background-app-item .subtitle, .quick-toggle .quick-toggle-subtitle, .screenshot-ui-type-button .icon-label-button-container, .prompt-dialog .prompt-dialog-error-label,
 +.prompt-dialog .prompt-dialog-info-label,
 +.prompt-dialog .prompt-dialog-null-label, .run-dialog .run-dialog-description, .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description, .message .message-header .message-header-content .event-time, .world-clocks-button .world-clocks-grid .world-clocks-timezone, .events-button .events-box .events-list .event-box .event-time {
 +  font-weight: 400;
 +  font-size: 0.818em; }
 +
 +.weather-button .weather-box .weather-grid .weather-forecast-time, .calendar .calendar-week-number, .calendar .calendar-day-heading, .calendar .calendar-day {
 +  font-weight: 400;
 +  font-size: 0.818em; }
 +
 +#LookingGlassDebugFlags .lg-debug-flag-button StLabel, #LookingGlassEvaluator .evaluator-results, .lg-dialog .actor-link {
 +  font-family: monospace; }
 +
 +.unlock-dialog-clock .unlock-dialog-clock-time, #panel, .weather-button .weather-box .weather-grid .weather-forecast-temp, .world-clocks-button .world-clocks-grid .world-clocks-timezone, .world-clocks-button .world-clocks-grid .world-clocks-time, .events-button .events-box .events-list .event-box .event-time, .calendar .calendar-day-heading, .calendar .calendar-day {
 +  font-feature-settings: "tnum"; }
 +
 +/* OSD Elements */
 +#LookingGlassDialog, .screenshot-ui-panel, .workspace-switcher, .switcher-list, .resize-popup, .osd-window {
 +  color: #ffffff;
-   background-color: #4d4d4d;
++  background-color: #2e2e33;
 +  border: 1px solid rgba(255, 255, 255, 0.02);
 +  border-radius: 999px;
 +  padding: 12px; }
 +
 +.lg-dialog StEntry {
-     background-color: #575757;
++  background-color: #47474c;
 +  color: rgba(255, 255, 255, 0.7); }
 +  .lg-dialog StEntry:hover {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, #4d4d4d, 5%);
++    background-color: #515157;
 +    color: #ffffff; }
 +  .lg-dialog StEntry:focus {
-     background-color: #454545;
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    background-color: st-mix(-st-accent-color, #47474c, 5%);
 +    color: #ffffff; }
 +  .lg-dialog StEntry:insensitive {
-   background-color: st-mix(#ffffff, #353535, 12%); }
++    background-color: #404044;
 +    color: rgba(255, 255, 255, 0.5); }
 +  .lg-dialog StEntry StLabel.hint-text {
 +    color: rgba(255, 255, 255, 0.7); }
 +
 +#LookingGlassDebugFlags .lg-debug-flag-button, #LookingGlassPropertyInspector .lg-obj-inspector-close-button,
 +#LookingGlassPropertyInspector .lg-obj-inspector-button, #LookingGlassDialog > #Toolbar .lg-toolbar-button {
 +  color: #ffffff;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 12%), 5%); }
++  background-color: st-mix(#ffffff, #2e2e33, 12%); }
 +  #LookingGlassDebugFlags .lg-debug-flag-button:focus, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:focus,
 +  #LookingGlassPropertyInspector .lg-obj-inspector-button:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus {
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 12%), 4%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    background-color: st-mix(-st-accent-color, st-mix(#ffffff, #2e2e33, 12%), 5%); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button:focus:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:focus:hover,
 +    #LookingGlassPropertyInspector .lg-obj-inspector-button:focus:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus:hover {
-     background-color: st-lighten(st-mix(#ffffff, #353535, 12%), 4%); }
++      background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #2e2e33, 12%), 4%), 5%); }
 +  #LookingGlassDebugFlags .lg-debug-flag-button:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:hover,
 +  #LookingGlassPropertyInspector .lg-obj-inspector-button:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:hover {
 +    color: #ffffff;
-     background-color: st-lighten(st-mix(#ffffff, #353535, 12%), 9%); }
++    background-color: st-lighten(st-mix(#ffffff, #2e2e33, 12%), 4%); }
 +  #LookingGlassDebugFlags .lg-debug-flag-button:active, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active,
 +  #LookingGlassPropertyInspector .lg-obj-inspector-button:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active {
 +    color: #ffffff;
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 12%), 9%), 4%); }
++    background-color: st-lighten(st-mix(#ffffff, #2e2e33, 12%), 9%); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button:active:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active:hover,
 +    #LookingGlassPropertyInspector .lg-obj-inspector-button:active:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 12%), 9%), 5%); }
++      background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 12%), 9%), 4%); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button:active:focus, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active:focus,
 +    #LookingGlassPropertyInspector .lg-obj-inspector-button:active:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active:focus {
-     background-color: st-lighten(st-mix(#ffffff, #353535, 12%), 8%); }
++      background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #2e2e33, 12%), 9%), 5%); }
 +  #LookingGlassDebugFlags .lg-debug-flag-button:checked, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked,
 +  #LookingGlassPropertyInspector .lg-obj-inspector-button:checked, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked {
 +    color: #ffffff;
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 12%), 8%), 4%); }
++    background-color: st-lighten(st-mix(#ffffff, #2e2e33, 12%), 8%); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button:checked:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked:hover,
 +    #LookingGlassPropertyInspector .lg-obj-inspector-button:checked:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:hover {
-       background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 12%), 8%), 9%); }
++      background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 12%), 8%), 4%); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button:checked:active, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked:active,
 +    #LookingGlassPropertyInspector .lg-obj-inspector-button:checked:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:active {
-     background-color: st-darken(st-mix(#ffffff, #353535, 12%), 3%); }
++      background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 12%), 8%), 9%); }
 +  #LookingGlassDebugFlags .lg-debug-flag-button:insensitive, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:insensitive,
 +  #LookingGlassPropertyInspector .lg-obj-inspector-button:insensitive, #LookingGlassDialog > #Toolbar .lg-toolbar-button:insensitive {
 +    color: st-transparentize(#ffffff, 0.6);
-   background-color: #353535; }
++    background-color: st-darken(st-mix(#ffffff, #2e2e33, 12%), 3%); }
 +
 +#LookingGlassDialog .notebook-tab, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button {
 +  color: #ffffff;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); }
++  background-color: #2e2e33; }
 +  #LookingGlassDialog .notebook-tab:focus, .screenshot-ui-show-pointer-button:focus, .screenshot-ui-type-button:focus {
 +    color: #ffffff;
-       background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); }
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    background-color: st-mix(-st-accent-color, rgba(46, 46, 51, 0.25), 5%); }
 +    #LookingGlassDialog .notebook-tab:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .screenshot-ui-type-button:focus:hover {
-     background-color: st-lighten(#353535, 7%); }
++      background-color: st-mix(-st-accent-color, st-lighten(#2e2e33, 7%), 5%); }
 +  #LookingGlassDialog .notebook-tab:hover, .screenshot-ui-show-pointer-button:hover, .screenshot-ui-type-button:hover {
 +    color: #ffffff;
-     background-color: st-lighten(#353535, 9%); }
++    background-color: st-lighten(#2e2e33, 7%); }
 +  #LookingGlassDialog .notebook-tab:active, .screenshot-ui-show-pointer-button:active, .screenshot-ui-type-button:active {
 +    color: #ffffff;
-       background-color: st-lighten(st-lighten(#353535, 9%), 7%); }
++    background-color: st-lighten(#2e2e33, 9%); }
 +    #LookingGlassDialog .notebook-tab:active:hover, .screenshot-ui-show-pointer-button:active:hover, .screenshot-ui-type-button:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); }
++      background-color: st-lighten(st-lighten(#2e2e33, 9%), 7%); }
 +    #LookingGlassDialog .notebook-tab:active:focus, .screenshot-ui-show-pointer-button:active:focus, .screenshot-ui-type-button:active:focus {
-     background-color: st-lighten(#353535, 8%); }
++      background-color: st-mix(-st-accent-color, st-lighten(#2e2e33, 9%), 5%); }
 +  #LookingGlassDialog .notebook-tab:checked, .screenshot-ui-show-pointer-button:checked, .screenshot-ui-type-button:checked {
 +    color: #ffffff;
-       background-color: st-lighten(st-lighten(#353535, 8%), 7%); }
++    background-color: st-lighten(#2e2e33, 8%); }
 +    #LookingGlassDialog .notebook-tab:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .screenshot-ui-type-button:checked:hover {
-       background-color: st-lighten(st-lighten(#353535, 8%), 9%); }
++      background-color: st-lighten(st-lighten(#2e2e33, 8%), 7%); }
 +    #LookingGlassDialog .notebook-tab:checked:active, .screenshot-ui-show-pointer-button:checked:active, .screenshot-ui-type-button:checked:active {
-     background-color: #353535; }
++      background-color: st-lighten(st-lighten(#2e2e33, 8%), 9%); }
 +  #LookingGlassDialog .notebook-tab:insensitive, .screenshot-ui-show-pointer-button:insensitive, .screenshot-ui-type-button:insensitive {
 +    color: st-transparentize(#ffffff, 0.6);
-   background-color: #4c4c4c;
-   color: rgba(245, 245, 245, 0.7); }
++    background-color: #2e2e33; }
 +
 +/* System Elements */
 +.login-dialog .login-dialog-prompt-entry, .app-folder-dialog .folder-name-container .folder-name-entry, .search-entry {
-     background-color: #565656;
-     color: whitesmoke; }
++  background-color: #47474b;
++  color: rgba(250, 250, 251, 0.7); }
 +  .login-dialog .login-dialog-prompt-entry:hover, .app-folder-dialog .folder-name-container .folder-name-entry:hover, .search-entry:hover {
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, #4c4c4c, 5%);
-     color: whitesmoke; }
++    background-color: #515155;
++    color: #fafafb; }
 +  .login-dialog .login-dialog-prompt-entry:focus, .app-folder-dialog .folder-name-container .folder-name-entry:focus, .search-entry:focus {
-     background-color: #444444;
-     color: rgba(245, 245, 245, 0.5); }
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    background-color: st-mix(-st-accent-color, #47474b, 5%);
++    color: #fafafb; }
 +  .login-dialog .login-dialog-prompt-entry:insensitive, .app-folder-dialog .folder-name-container .folder-name-entry:insensitive, .search-entry:insensitive {
-     color: rgba(245, 245, 245, 0.7); }
++    background-color: #404043;
++    color: rgba(250, 250, 251, 0.5); }
 +  .login-dialog .login-dialog-prompt-entry StLabel.hint-text, .app-folder-dialog .folder-name-container .folder-name-entry StLabel.hint-text, .search-entry StLabel.hint-text {
-   color: whitesmoke;
-   background-color: st-mix(whitesmoke, #353535, 12%); }
++    color: rgba(250, 250, 251, 0.7); }
 +
 +.login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button {
-     color: st-transparentize(whitesmoke, 0.6);
-     background-color: st-lighten(st-mix(whitesmoke, #353535, 12%), 3%); }
++  color: #fafafb;
++  background-color: st-mix(#fafafb, #2e2e33, 12%); }
 +  .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive {
-     color: whitesmoke;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, st-mix(whitesmoke, #353535, 12%), 5%); }
++    color: st-transparentize(#fafafb, 0.6);
++    background-color: st-lighten(st-mix(#fafafb, #2e2e33, 12%), 3%); }
 +  .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus {
-       background-color: st-mix(-st-accent-color, st-darken(st-mix(whitesmoke, #353535, 12%), 4%), 5%); }
++    color: #fafafb;
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    background-color: st-mix(-st-accent-color, st-mix(#fafafb, #2e2e33, 12%), 5%); }
 +    .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover {
-     color: whitesmoke;
-     background-color: st-darken(st-mix(whitesmoke, #353535, 12%), 4%); }
++      background-color: st-mix(-st-accent-color, st-darken(st-mix(#fafafb, #2e2e33, 12%), 4%), 5%); }
 +  .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover {
-     color: whitesmoke;
-     background-color: st-darken(st-mix(whitesmoke, #353535, 12%), 9%); }
++    color: #fafafb;
++    background-color: st-darken(st-mix(#fafafb, #2e2e33, 12%), 4%); }
 +  .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active {
-       background-color: st-darken(st-darken(st-mix(whitesmoke, #353535, 12%), 9%), 4%); }
++    color: #fafafb;
++    background-color: st-darken(st-mix(#fafafb, #2e2e33, 12%), 9%); }
 +    .login-dialog-button.cancel-button:active:hover, .login-dialog-button.switch-user-button:active:hover, .login-dialog-button.login-dialog-session-list-button:active:hover {
-       background-color: st-mix(-st-accent-color, st-darken(st-mix(whitesmoke, #353535, 12%), 9%), 5%); }
++      background-color: st-darken(st-darken(st-mix(#fafafb, #2e2e33, 12%), 9%), 4%); }
 +    .login-dialog-button.cancel-button:active:focus, .login-dialog-button.switch-user-button:active:focus, .login-dialog-button.login-dialog-session-list-button:active:focus {
-     color: whitesmoke;
-     background-color: st-darken(st-mix(whitesmoke, #353535, 12%), 8%); }
++      background-color: st-mix(-st-accent-color, st-darken(st-mix(#fafafb, #2e2e33, 12%), 9%), 5%); }
 +  .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked {
-       background-color: st-darken(st-darken(st-mix(whitesmoke, #353535, 12%), 8%), 4%); }
++    color: #fafafb;
++    background-color: st-darken(st-mix(#fafafb, #2e2e33, 12%), 8%); }
 +    .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover {
-       background-color: st-darken(st-darken(st-mix(whitesmoke, #353535, 12%), 8%), 9%); }
++      background-color: st-darken(st-darken(st-mix(#fafafb, #2e2e33, 12%), 8%), 4%); }
 +    .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active {
-   color: whitesmoke;
-   background-color: rgba(245, 245, 245, 0.1); }
++      background-color: st-darken(st-darken(st-mix(#fafafb, #2e2e33, 12%), 8%), 9%); }
 +
 +/* Lockscreen Elements */
 +.unlock-dialog .button,
 +.unlock-dialog .icon-button,
 +.unlock-dialog .calendar .calendar-month-header .pager-button,
 +.calendar .calendar-month-header .unlock-dialog .pager-button,
 +.unlock-dialog .message .message-header .message-expand-button,
 +.message .message-header .unlock-dialog .message-expand-button,
 +.unlock-dialog .message .message-header .message-close-button,
 +.message .message-header .unlock-dialog .message-close-button,
 +.unlock-dialog .screenshot-ui-show-pointer-button,
 +.unlock-dialog .login-dialog-button.cancel-button,
 +.unlock-dialog .login-dialog-button.switch-user-button,
 +.unlock-dialog .login-dialog-button.login-dialog-session-list-button {
-     color: whitesmoke;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.1), 5%); }
++  color: #fafafb;
++  background-color: rgba(250, 250, 251, 0.1); }
 +  .unlock-dialog .button:focus,
 +  .unlock-dialog .icon-button:focus,
 +  .unlock-dialog .calendar .calendar-month-header .pager-button:focus,
 +  .calendar .calendar-month-header .unlock-dialog .pager-button:focus,
 +  .unlock-dialog .message .message-header .message-expand-button:focus,
 +  .message .message-header .unlock-dialog .message-expand-button:focus,
 +  .unlock-dialog .message .message-header .message-close-button:focus,
 +  .message .message-header .unlock-dialog .message-close-button:focus,
 +  .unlock-dialog .screenshot-ui-show-pointer-button:focus,
 +  .unlock-dialog .login-dialog-button.cancel-button:focus,
 +  .unlock-dialog .login-dialog-button.switch-user-button:focus,
 +  .unlock-dialog .login-dialog-button.login-dialog-session-list-button:focus {
-       background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.13), 5%); }
++    color: #fafafb;
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    background-color: st-mix(-st-accent-color, rgba(250, 250, 251, 0.1), 5%); }
 +    .unlock-dialog .button:focus:hover,
 +    .unlock-dialog .icon-button:focus:hover,
 +    .unlock-dialog .calendar .calendar-month-header .pager-button:focus:hover,
 +    .calendar .calendar-month-header .unlock-dialog .pager-button:focus:hover,
 +    .unlock-dialog .message .message-header .message-expand-button:focus:hover,
 +    .message .message-header .unlock-dialog .message-expand-button:focus:hover,
 +    .unlock-dialog .message .message-header .message-close-button:focus:hover,
 +    .message .message-header .unlock-dialog .message-close-button:focus:hover,
 +    .unlock-dialog .screenshot-ui-show-pointer-button:focus:hover,
 +    .unlock-dialog .login-dialog-button.cancel-button:focus:hover,
 +    .unlock-dialog .login-dialog-button.switch-user-button:focus:hover,
 +    .unlock-dialog .login-dialog-button.login-dialog-session-list-button:focus:hover {
-     color: whitesmoke;
-     background-color: rgba(245, 245, 245, 0.13); }
++      background-color: st-mix(-st-accent-color, rgba(250, 250, 251, 0.13), 5%); }
 +  .unlock-dialog .button:hover,
 +  .unlock-dialog .icon-button:hover,
 +  .unlock-dialog .calendar .calendar-month-header .pager-button:hover,
 +  .calendar .calendar-month-header .unlock-dialog .pager-button:hover,
 +  .unlock-dialog .message .message-header .message-expand-button:hover,
 +  .message .message-header .unlock-dialog .message-expand-button:hover,
 +  .unlock-dialog .message .message-header .message-close-button:hover,
 +  .message .message-header .unlock-dialog .message-close-button:hover,
 +  .unlock-dialog .screenshot-ui-show-pointer-button:hover,
 +  .unlock-dialog .login-dialog-button.cancel-button:hover,
 +  .unlock-dialog .login-dialog-button.switch-user-button:hover,
 +  .unlock-dialog .login-dialog-button.login-dialog-session-list-button:hover {
-     color: whitesmoke;
-     background-color: rgba(245, 245, 245, 0.16); }
++    color: #fafafb;
++    background-color: rgba(250, 250, 251, 0.13); }
 +  .unlock-dialog .button:active,
 +  .unlock-dialog .icon-button:active,
 +  .unlock-dialog .calendar .calendar-month-header .pager-button:active,
 +  .calendar .calendar-month-header .unlock-dialog .pager-button:active,
 +  .unlock-dialog .message .message-header .message-expand-button:active,
 +  .message .message-header .unlock-dialog .message-expand-button:active,
 +  .unlock-dialog .message .message-header .message-close-button:active,
 +  .message .message-header .unlock-dialog .message-close-button:active,
 +  .unlock-dialog .screenshot-ui-show-pointer-button:active,
 +  .unlock-dialog .login-dialog-button.cancel-button:active,
 +  .unlock-dialog .login-dialog-button.switch-user-button:active,
 +  .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active {
-       background-color: rgba(245, 245, 245, 0.19); }
++    color: #fafafb;
++    background-color: rgba(250, 250, 251, 0.16); }
 +    .unlock-dialog .button:active:hover,
 +    .unlock-dialog .icon-button:active:hover,
 +    .unlock-dialog .calendar .calendar-month-header .pager-button:active:hover,
 +    .calendar .calendar-month-header .unlock-dialog .pager-button:active:hover,
 +    .unlock-dialog .message .message-header .message-expand-button:active:hover,
 +    .message .message-header .unlock-dialog .message-expand-button:active:hover,
 +    .unlock-dialog .message .message-header .message-close-button:active:hover,
 +    .message .message-header .unlock-dialog .message-close-button:active:hover,
 +    .unlock-dialog .screenshot-ui-show-pointer-button:active:hover,
 +    .unlock-dialog .login-dialog-button.cancel-button:active:hover,
 +    .unlock-dialog .login-dialog-button.switch-user-button:active:hover,
 +    .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active:hover {
-       background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.16), 5%); }
++      background-color: rgba(250, 250, 251, 0.19); }
 +    .unlock-dialog .button:active:focus,
 +    .unlock-dialog .icon-button:active:focus,
 +    .unlock-dialog .calendar .calendar-month-header .pager-button:active:focus,
 +    .calendar .calendar-month-header .unlock-dialog .pager-button:active:focus,
 +    .unlock-dialog .message .message-header .message-expand-button:active:focus,
 +    .message .message-header .unlock-dialog .message-expand-button:active:focus,
 +    .unlock-dialog .message .message-header .message-close-button:active:focus,
 +    .message .message-header .unlock-dialog .message-close-button:active:focus,
 +    .unlock-dialog .screenshot-ui-show-pointer-button:active:focus,
 +    .unlock-dialog .login-dialog-button.cancel-button:active:focus,
 +    .unlock-dialog .login-dialog-button.switch-user-button:active:focus,
 +    .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active:focus {
-     color: whitesmoke;
-     background-color: st-darken(st-mix(whitesmoke, whitesmoke, 12%), 8%); }
++      background-color: st-mix(-st-accent-color, rgba(250, 250, 251, 0.16), 5%); }
 +  .unlock-dialog .button:checked,
 +  .unlock-dialog .icon-button:checked,
 +  .unlock-dialog .calendar .calendar-month-header .pager-button:checked,
 +  .calendar .calendar-month-header .unlock-dialog .pager-button:checked,
 +  .unlock-dialog .message .message-header .message-expand-button:checked,
 +  .message .message-header .unlock-dialog .message-expand-button:checked,
 +  .unlock-dialog .message .message-header .message-close-button:checked,
 +  .message .message-header .unlock-dialog .message-close-button:checked,
 +  .unlock-dialog .screenshot-ui-show-pointer-button:checked,
 +  .unlock-dialog .login-dialog-button.cancel-button:checked,
 +  .unlock-dialog .login-dialog-button.switch-user-button:checked,
 +  .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked {
-       background-color: st-darken(st-darken(st-mix(whitesmoke, whitesmoke, 12%), 8%), 4%); }
++    color: #fafafb;
++    background-color: st-darken(st-mix(#fafafb, #fafafb, 12%), 8%); }
 +    .unlock-dialog .button:checked:hover,
 +    .unlock-dialog .icon-button:checked:hover,
 +    .unlock-dialog .calendar .calendar-month-header .pager-button:checked:hover,
 +    .calendar .calendar-month-header .unlock-dialog .pager-button:checked:hover,
 +    .unlock-dialog .message .message-header .message-expand-button:checked:hover,
 +    .message .message-header .unlock-dialog .message-expand-button:checked:hover,
 +    .unlock-dialog .message .message-header .message-close-button:checked:hover,
 +    .message .message-header .unlock-dialog .message-close-button:checked:hover,
 +    .unlock-dialog .screenshot-ui-show-pointer-button:checked:hover,
 +    .unlock-dialog .login-dialog-button.cancel-button:checked:hover,
 +    .unlock-dialog .login-dialog-button.switch-user-button:checked:hover,
 +    .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked:hover {
-       background-color: st-darken(st-darken(st-mix(whitesmoke, whitesmoke, 12%), 8%), 9%); }
++      background-color: st-darken(st-darken(st-mix(#fafafb, #fafafb, 12%), 8%), 4%); }
 +    .unlock-dialog .button:checked:active,
 +    .unlock-dialog .icon-button:checked:active,
 +    .unlock-dialog .calendar .calendar-month-header .pager-button:checked:active,
 +    .calendar .calendar-month-header .unlock-dialog .pager-button:checked:active,
 +    .unlock-dialog .message .message-header .message-expand-button:checked:active,
 +    .message .message-header .unlock-dialog .message-expand-button:checked:active,
 +    .unlock-dialog .message .message-header .message-close-button:checked:active,
 +    .message .message-header .unlock-dialog .message-close-button:checked:active,
 +    .unlock-dialog .screenshot-ui-show-pointer-button:checked:active,
 +    .unlock-dialog .login-dialog-button.cancel-button:checked:active,
 +    .unlock-dialog .login-dialog-button.switch-user-button:checked:active,
 +    .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked:active {
-     color: st-transparentize(whitesmoke, 0.6);
-     background-color: st-lighten(st-mix(whitesmoke, whitesmoke, 12%), 3%); }
++      background-color: st-darken(st-darken(st-mix(#fafafb, #fafafb, 12%), 8%), 9%); }
 +  .unlock-dialog .button:insensitive,
 +  .unlock-dialog .icon-button:insensitive,
 +  .unlock-dialog .calendar .calendar-month-header .pager-button:insensitive,
 +  .calendar .calendar-month-header .unlock-dialog .pager-button:insensitive,
 +  .unlock-dialog .message .message-header .message-expand-button:insensitive,
 +  .message .message-header .unlock-dialog .message-expand-button:insensitive,
 +  .unlock-dialog .message .message-header .message-close-button:insensitive,
 +  .message .message-header .unlock-dialog .message-close-button:insensitive,
 +  .unlock-dialog .screenshot-ui-show-pointer-button:insensitive,
 +  .unlock-dialog .login-dialog-button.cancel-button:insensitive,
 +  .unlock-dialog .login-dialog-button.switch-user-button:insensitive,
 +  .unlock-dialog .login-dialog-button.login-dialog-session-list-button:insensitive {
-   background-color: rgba(245, 245, 245, 0.1);
-   color: rgba(245, 245, 245, 0.7); }
++    color: st-transparentize(#fafafb, 0.6);
++    background-color: st-lighten(st-mix(#fafafb, #fafafb, 12%), 3%); }
 +
 +.unlock-dialog .login-dialog-prompt-entry {
-     color: whitesmoke; }
++  background-color: rgba(250, 250, 251, 0.1);
++  color: rgba(250, 250, 251, 0.7); }
 +  .unlock-dialog .login-dialog-prompt-entry:hover {
 +    background-color: rgba(255, 255, 255, 0.1);
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.1), 5%);
-     color: whitesmoke;
-     box-shadow: inset 0 0 0 2px rgba(245, 245, 245, 0.4) !important;
-     background-color: st-mix(rgba(245, 245, 245, 0.4), rgba(245, 245, 245, 0.1), 5%); }
++    color: #fafafb; }
 +  .unlock-dialog .login-dialog-prompt-entry:focus {
-     background-color: rgba(237, 237, 237, 0.1);
-     color: rgba(245, 245, 245, 0.5); }
++    box-shadow: inset 0 0 0 2px st-transparentize(rgba(250, 250, 251, 0.4), 0.2) !important;
++    background-color: st-mix(-st-accent-color, rgba(250, 250, 251, 0.1), 5%);
++    color: #fafafb;
++    box-shadow: inset 0 0 0 2px st-transparentize(rgba(250, 250, 251, 0.4), 0.2) !important;
++    background-color: st-mix(rgba(250, 250, 251, 0.4), rgba(250, 250, 251, 0.1), 5%); }
 +  .unlock-dialog .login-dialog-prompt-entry:insensitive {
-     color: rgba(245, 245, 245, 0.7); }
++    background-color: rgba(242, 242, 244, 0.1);
++    color: rgba(250, 250, 251, 0.5); }
 +  .unlock-dialog .login-dialog-prompt-entry StLabel.hint-text {
-   warning-color: #f5c211;
++    color: rgba(250, 250, 251, 0.7); }
 +
 +/* WIDGETS */
 +.shell-link {
 +  color: st-darken(-st-accent-color, 10%); }
 +  .shell-link:hover {
 +    color: st-lighten(st-darken(-st-accent-color, 10%), 10%); }
 +
 +.lowres-icon {
 +  icon-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); }
 +
 +.icon-dropshadow {
 +  icon-shadow: 0 2px 4px rgba(0, 0, 0, 0.4); }
 +
 +/* Entries */
 +StEntry StIcon.capslock-warning {
 +  icon-size: 1.091em;
-   color: #282828;
++  warning-color: #e5a50a;
 +  padding: 0 4px; }
 +
 +StEntry StIcon.peek-password {
 +  icon-size: 1.091em;
 +  padding: 0 4px; }
 +
 +StEntry StLabel.hint-text {
 +  margin-left: 2px; }
 +
 +/* Buttons */
 +.button {
 +  min-height: 1.5em; }
 +
 +.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .screenshot-ui-show-pointer-button, .message .message-header .message-expand-button,
 +.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button {
 +  border-radius: 999px;
 +  padding: 0.818em;
 +  min-height: 1.091em; }
 +  .icon-button StIcon, .login-dialog-button.cancel-button StIcon, .login-dialog-button.switch-user-button StIcon, .login-dialog-button.login-dialog-session-list-button StIcon, .screenshot-ui-show-pointer-button StIcon, .message .message-header .message-expand-button StIcon,
 +  .message .message-header .message-close-button StIcon, .calendar .calendar-month-header .pager-button StIcon {
 +    icon-size: 1.091em;
 +    -st-icon-style: symbolic; }
 +
 +/* Check Boxes */
 +.check-box StBoxLayout {
 +  spacing: .8em; }
 +
 +.check-box StBin {
 +  border-radius: 7px;
 +  padding: 2px; }
 +
 +.check-box:focus StBin {
 +  background-color: rgba(0, 0, 0, 0.01);
 +  box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.65); }
 +
 +.check-box StIcon {
 +  icon-size: 14px;
 +  padding: 1px;
 +  color: transparent;
 +  border-radius: 6px;
 +  border: 2px solid rgba(0, 0, 0, 0.15); }
 +
 +.check-box:hover StIcon {
 +  border-color: rgba(0, 0, 0, 0.2); }
 +
 +.check-box:active StIcon {
 +  border-color: rgba(0, 0, 0, 0.3); }
 +
 +.check-box:checked StIcon {
 +  background-color: -st-accent-color;
 +  color: -st-accent-fg-color;
 +  border-color: transparent; }
 +
 +.check-box:checked:hover StIcon {
 +  background-color: st-lighten(-st-accent-color, 5%);
 +  color: st-lighten(-st-accent-fg-color, 5%); }
 +
 +.check-box:checked:active StIcon {
 +  background-color: st-darken(-st-accent-color, 7%);
 +  color: st-darken(-st-accent-fg-color, 7%); }
 +
 +/* Switches */
 +.toggle-switch {
 +  width: 46px;
 +  border-radius: 999px;
 +  transition-duration: 100ms;
-   color: #282828;
++  color: #222226;
 +  background: rgba(0, 0, 0, 0.15); }
 +  .toggle-switch:hover {
 +    background: rgba(0, 0, 0, 0.2); }
 +  .toggle-switch StIcon {
 +    icon-size: 16px; }
 +  .toggle-switch .handle {
 +    margin: 3px;
 +    width: 20px;
 +    height: 20px;
 +    border-radius: 999px;
 +    background: white;
 +    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
 +    transition-duration: 100ms; }
 +  .toggle-switch:checked {
 +    background: -st-accent-color;
 +    color: -st-accent-fg-color; }
 +    .toggle-switch:checked:hover {
 +      background-color: st-lighten(-st-accent-color, 5%);
 +      color: st-lighten(-st-accent-fg-color, 5%); }
 +    .toggle-switch:checked .handle {
 +      background: white; }
 +
 +/* Slider */
 +.slider {
-   -barlevel-background-color: rgba(40, 40, 40, 0.1);
++  color: #222226;
 +  -barlevel-height: 4px;
-     color: #3a3a3a; }
++  -barlevel-background-color: rgba(34, 34, 38, 0.1);
 +  -barlevel-active-background-color: -st-accent-color;
 +  -barlevel-overdrive-color: #e01b24;
 +  -barlevel-overdrive-separator-width: 1px;
 +  -slider-handle-radius: 0.5455em; }
 +  .slider:hover {
-     background-color: #b8b8b8;
++    color: #333339; }
 +
 +/* Scrollbars */
 +StScrollView.vfade {
 +  -st-vfade-offset: 68px; }
 +
 +StScrollView.hfade {
 +  -st-hfade-offset: 68px; }
 +
 +StScrollBar {
 +  padding: 0; }
 +  StScrollView StScrollBar {
 +    min-width: 8px;
 +    min-height: 8px; }
 +  StScrollBar StBin#trough {
 +    border-radius: 0;
 +    background-color: transparent; }
 +  StScrollBar StButton#vhandle, StScrollBar StButton#hhandle {
 +    border-radius: 8px;
-       background-color: #8f8f8f; }
++    background-color: #b9b9bb;
 +    border: 3px solid transparent;
 +    transition: 500ms all ease; }
 +    StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover {
-       background-color: #a3a3a3; }
++      background-color: #8e8e91; }
 +    StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active {
-   color: #282828; }
++      background-color: #a4a4a6; }
 +
 +/* Popovers/Menus */
 +.popup-menu-boxpointer, .candidate-popup-boxpointer {
 +  -arrow-rise: 6px; }
 +
 +.popup-menu {
 +  min-width: 15em;
-   background-color: whitesmoke;
++  color: #222226; }
 +  .popup-menu.panel-menu {
 +    margin-bottom: 1.75em; }
 +
 +.popup-menu-content, .candidate-popup-content {
 +  padding: 6px;
-   border: 1px solid #e3e3e3;
++  background-color: #fafafb;
 +  border-radius: 20px;
-   .popup-menu-item:hover {
-     color: #282828;
-     background-color: st-darken(st-mix(#282828, #e8e8e8, 12%), 4%); }
++  border: 1px solid #e6e6eb;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05); }
 +
 +.popup-menu-item {
 +  background-color: transparent;
 +  border-color: transparent;
 +  box-shadow: none;
 +  border-radius: 12px; }
 +  .popup-menu-item:insensitive {
 +    background-color: transparent !important; }
-     color: #282828;
-     background-color: st-darken(st-mix(#282828, #e8e8e8, 12%), 9%); }
 +  .popup-menu-item:active {
-       background-color: st-darken(st-darken(st-mix(#282828, #e8e8e8, 12%), 9%), 4%); }
++    color: #222226;
++    background-color: st-darken(#ececf0, 9%); }
 +    .popup-menu-item:active:hover {
-       background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, #e8e8e8, 12%), 9%), 5%); }
-   .popup-menu-item:selected, .popup-menu-item:checked {
-     color: #282828;
-     background-color: st-darken(st-mix(#282828, #e8e8e8, 12%), 8%); }
-     .popup-menu-item:selected:hover, .popup-menu-item:checked:hover {
-       background-color: st-darken(st-darken(st-mix(#282828, #e8e8e8, 12%), 8%), 4%); }
-     .popup-menu-item:selected:active, .popup-menu-item:checked:active {
-       background-color: st-darken(st-darken(st-mix(#282828, #e8e8e8, 12%), 8%), 9%); }
++      background-color: st-darken(st-darken(#ececf0, 9%), 7%); }
 +    .popup-menu-item:active:focus {
-     color: st-transparentize(#282828, 0.6);
-     background-color: st-lighten(st-mix(#282828, #e8e8e8, 12%), 3%); }
++      background-color: st-mix(-st-accent-color, st-darken(#ececf0, 9%), 5%); }
++  .popup-menu-item:hover, .popup-menu-item:selected, .popup-menu-item:checked {
++    color: #222226;
++    background-color: st-darken(#ececf0, 7%); }
 +  .popup-menu-item:insensitive {
-   color: #282828; }
++    color: st-transparentize(#222226, 0.6);
++    background-color: #ececf0; }
 +  .popup-menu-item:checked {
 +    border-radius: 12px 12px 0 0 !important; }
 +  .popup-menu-item .toggle-switch:ltr {
 +    margin-left: 4px; }
 +  .popup-menu-item .toggle-switch:rtl {
 +    margin-right: 4px; }
 +
 +.popup-ornamented-menu-item:ltr {
 +  padding-left: 6px; }
 +
 +.popup-ornamented-menu-item:rtl {
 +  padding-right: 6px; }
 +
 +.popup-inactive-menu-item {
-     color: #7a7a7a; }
++  color: #222226; }
 +  .popup-inactive-menu-item:insensitive {
-   background-color: #cacaca; }
++    color: #78787b; }
 +
 +.popup-menu-arrow,
 +.popup-menu-icon {
 +  icon-size: 1.091em; }
 +
 +.popup-sub-menu {
 +  border-radius: 0 0 13px 13px;
 +  margin-bottom: 6px;
 +  border: 1px solid transparent;
-     .popup-sub-menu .popup-menu-item:hover {
-       color: #282828;
-       background-color: st-darken(st-mix(#282828, #cacaca, 12%), 4%); }
++  background-color: #cacad4; }
 +  .popup-sub-menu .popup-menu-item {
 +    border-radius: 0;
 +    border-top-width: 0;
 +    background-color: transparent;
 +    border-color: transparent;
 +    box-shadow: none; }
 +    .popup-sub-menu .popup-menu-item:insensitive {
 +      background-color: transparent !important; }
-       color: #282828;
-       background-color: st-darken(st-mix(#282828, #cacaca, 12%), 9%); }
 +    .popup-sub-menu .popup-menu-item:active {
-         background-color: st-darken(st-darken(st-mix(#282828, #cacaca, 12%), 9%), 4%); }
++      color: #222226;
++      background-color: st-darken(#cacad4, 9%); }
 +      .popup-sub-menu .popup-menu-item:active:hover {
-         background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, #cacaca, 12%), 9%), 5%); }
-     .popup-sub-menu .popup-menu-item:selected, .popup-sub-menu .popup-menu-item:checked {
-       color: #282828;
-       background-color: st-darken(st-mix(#282828, #cacaca, 12%), 8%); }
-       .popup-sub-menu .popup-menu-item:selected:hover, .popup-sub-menu .popup-menu-item:checked:hover {
-         background-color: st-darken(st-darken(st-mix(#282828, #cacaca, 12%), 8%), 4%); }
-       .popup-sub-menu .popup-menu-item:selected:active, .popup-sub-menu .popup-menu-item:checked:active {
-         background-color: st-darken(st-darken(st-mix(#282828, #cacaca, 12%), 8%), 9%); }
++        background-color: st-darken(st-darken(#cacad4, 9%), 7%); }
 +      .popup-sub-menu .popup-menu-item:active:focus {
-       color: st-transparentize(#282828, 0.6);
-       background-color: st-lighten(st-mix(#282828, #cacaca, 12%), 3%); }
++        background-color: st-mix(-st-accent-color, st-darken(#cacad4, 9%), 5%); }
++    .popup-sub-menu .popup-menu-item:hover, .popup-sub-menu .popup-menu-item:selected, .popup-sub-menu .popup-menu-item:checked {
++      color: #222226;
++      background-color: st-darken(#cacad4, 7%); }
 +    .popup-sub-menu .popup-menu-item:insensitive {
-     background-color: rgba(40, 40, 40, 0.15); }
++      color: st-transparentize(#222226, 0.6);
++      background-color: #cacad4; }
 +    .popup-sub-menu .popup-menu-item:last-child {
 +      border-radius: 0 0 12px 12px;
 +      border-bottom-width: 0; }
 +  .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:hover, .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:focus {
 +    border-radius: 0; }
 +  .popup-sub-menu .popup-menu-section:last-child .popup-menu-item:last-child {
 +    border-radius: 0 0 12px 12px; }
 +
 +.popup-menu-ornament {
 +  icon-size: 1.091em !important;
 +  width: 1.091em; }
 +
 +.popup-separator-menu-item {
 +  border: none !important; }
 +  .popup-separator-menu-item .popup-separator-menu-item-separator {
 +    height: 1px;
-       background-color: rgba(40, 40, 40, 0.15); }
++    background-color: rgba(34, 34, 38, 0.15); }
 +  .popup-sub-menu .popup-separator-menu-item {
 +    background-color: transparent; }
 +    .popup-sub-menu .popup-separator-menu-item:ltr {
 +      margin-right: 2.5em; }
 +    .popup-sub-menu .popup-separator-menu-item:rtl {
 +      margin-left: 2.5em; }
 +    .popup-sub-menu .popup-separator-menu-item .popup-separator-menu-item-separator {
-     color: #282828 !important;
++      background-color: rgba(34, 34, 38, 0.15); }
 +
 +.background-menu {
 +  -boxpointer-gap: 0px;
 +  -arrow-rise: 0px; }
 +
 +.app-menu {
 +  max-width: 27.25em; }
 +  .app-menu .popup-inactive-menu-item:first-child > StLabel:ltr {
 +    margin-right: 8px; }
 +  .app-menu .popup-inactive-menu-item:first-child > StLabel:rtl {
 +    margin-left: 8px; }
 +
 +/* Date/Time Menu */
 +#calendarArea {
 +  padding: 4px; }
 +
 +.datemenu-popover {
 +  border-radius: 30px; }
 +
 +.datemenu-calendar-column {
 +  spacing: 6px; }
 +  .datemenu-calendar-column:ltr {
 +    margin-left: 6px; }
 +  .datemenu-calendar-column:rtl {
 +    margin-right: 6px; }
 +  .datemenu-calendar-column .datemenu-displays-box {
 +    spacing: 6px; }
 +
 +.datemenu-today-button {
 +  padding: 9px; }
 +  .datemenu-today-button .day-label {
 +    font-weight: bold; }
 +
 +.calendar {
 +  margin-top: 0;
 +  padding: 0; }
 +  .calendar .calendar-month-header .calendar-change-month-back StIcon,
 +  .calendar .calendar-month-header .calendar-change-month-forward StIcon {
 +    icon-size: 1.091em; }
 +  .calendar .calendar-month-header .calendar-month-label {
-       color: #7a7a7a; }
++    color: #222226 !important;
 +    padding: 8px 0;
 +    width: 10em;
 +    border-radius: 999px;
 +    text-align: center; }
 +  .calendar .calendar-month-header .pager-button {
 +    height: 2.6em;
 +    width: 2.6em;
 +    padding: 0; }
 +  .calendar .calendar-day {
 +    border-radius: 999px;
 +    height: 3em;
 +    width: 3em;
 +    margin: 2px;
 +    padding: 0;
 +    font-weight: bold;
 +    text-align: center; }
 +    .calendar .calendar-day.calendar-weekend {
-       color: rgba(40, 40, 40, 0.5);
++      color: #78787b; }
 +    .calendar .calendar-day.calendar-other-month {
-         color: rgba(40, 40, 40, 0.5); }
++      color: rgba(34, 34, 38, 0.5);
 +      font-weight: normal; }
 +      .calendar .calendar-day.calendar-other-month.calendar-weekend {
-     background-color: rgba(122, 122, 122, 0.2);
-     color: #7a7a7a; }
++        color: rgba(34, 34, 38, 0.5); }
 +    .calendar .calendar-day.calendar-today {
 +      color: -st-accent-fg-color !important; }
 +      .calendar .calendar-day.calendar-today.calendar-day-with-events {
 +        background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg") !important; }
 +    .calendar .calendar-day.calendar-day-with-events {
 +      background-image: url("resource:///org/gnome/shell/theme/calendar-today-light.svg");
 +      background-size: contain; }
 +  .calendar .calendar-day-heading {
 +    font-weight: bold;
 +    text-align: center;
 +    margin: 4px;
 +    padding: 3px 6px;
 +    border-radius: 8px; }
 +  .calendar .calendar-week-number {
 +    font-weight: bold;
 +    font-feature-settings: "tnum";
 +    text-align: center;
 +    margin: 6px;
 +    padding: 0 6px;
 +    border-radius: 4px;
-   color: #7a7a7a;
++    background-color: rgba(120, 120, 123, 0.2);
++    color: #78787b; }
 +
 +.events-button .events-box .events-title {
-       color: #7a7a7a; }
++  color: #78787b;
 +  padding-bottom: 6px; }
 +
 +.events-button .events-box .events-list {
 +  spacing: 6px; }
 +  .events-button .events-box .events-list .event-box {
 +    spacing: 6px;
 +    border-radius: 8px; }
 +    .events-button .events-box .events-list .event-box .event-time {
-     color: #7a7a7a;
++      color: #78787b; }
 +  .events-button .events-box .events-list .event-placeholder {
-   color: #7a7a7a; }
++    color: #78787b;
 +    font-style: italic; }
 +
 +.world-clocks-button .world-clocks-header {
-     color: #282828; }
++  color: #78787b; }
 +  .world-clocks-button .world-clocks-header.no-world-clocks {
-     color: #7a7a7a; }
++    color: #222226; }
 +
 +.world-clocks-button .world-clocks-grid {
 +  spacing-rows: 6px;
 +  spacing-columns: 12px; }
 +  .world-clocks-button .world-clocks-grid .world-clocks-time {
 +    font-weight: bold; }
 +    .world-clocks-button .world-clocks-grid .world-clocks-time:ltr {
 +      text-align: right; }
 +    .world-clocks-button .world-clocks-grid .world-clocks-time:rtl {
 +      text-align: left; }
 +  .world-clocks-button .world-clocks-grid .world-clocks-timezone {
-       color: #7a7a7a; }
++    color: #78787b; }
 +
 +.weather-button .weather-box {
 +  spacing: 6px; }
 +  .weather-button .weather-box .weather-header-box {
 +    spacing: 6px; }
 +    .weather-button .weather-box .weather-header-box .weather-header {
-         color: #282828; }
++      color: #78787b; }
 +      .weather-button .weather-box .weather-header-box .weather-header.no-location {
-   border: solid rgba(40, 40, 40, 0.15); }
++        color: #222226; }
 +      .weather-button .weather-box .weather-header-box .weather-header.location {
 +        font-weight: normal; }
 +  .weather-button .weather-box .weather-grid {
 +    spacing-rows: 6px;
 +    spacing-columns: 12px; }
 +    .weather-button .weather-box .weather-grid .weather-forecast-time {
 +      padding-top: 6px;
 +      padding-bottom: 6px; }
 +    .weather-button .weather-box .weather-grid .weather-forecast-icon {
 +      icon-size: 2.182em;
 +      margin-bottom: 4px; }
 +    .weather-button .weather-box .weather-grid .weather-forecast-temp {
 +      font-weight: bold; }
 +
 +/* Message List */
 +.message-list {
 +  width: 29em;
-     color: rgba(40, 40, 40, 0.25); }
++  border: solid rgba(34, 34, 38, 0.15); }
 +  .message-list:ltr {
 +    margin-left: 0;
 +    margin-right: 4px;
 +    padding-right: 6px;
 +    border-right-width: 1px; }
 +  .message-list:rtl {
 +    margin-right: 0;
 +    margin-left: 4px;
 +    padding-left: 6px;
 +    border-left-width: 1px; }
 +  .message-list .message-list-placeholder {
-     color: #7a7a7a;
++    color: rgba(34, 34, 38, 0.45); }
 +    .message-list .message-list-placeholder > StIcon {
 +      icon-size: 96px;
 +      margin-bottom: 12px;
 +      -st-icon-style: symbolic; }
 +
 +.message-list-sections {
 +  spacing: 12px; }
 +  .message-list-sections:ltr {
 +    margin-right: 12px; }
 +  .message-list-sections:rtl {
 +    margin-left: 12px; }
 +
 +.message-list-section,
 +.message-list-section-list {
 +  spacing: 12px; }
 +
 +.message-list-controls {
 +  padding: 12px;
 +  padding-bottom: 6px;
 +  spacing: 6px; }
 +  .message-list-controls .dnd-button {
 +    border-width: 2px;
 +    border-color: transparent;
 +    border-radius: 32px;
 +    border-style: solid; }
 +    .message-list-controls .dnd-button:focus {
 +      border-color: st-transparentize(-st-accent-color, 0.4); }
 +
 +.message {
 +  padding: 6px;
 +  margin: 0;
 +  border-radius: 16px; }
 +  .message .message-header {
 +    spacing: 6px;
-         color: #7a7a7a;
++    color: #78787b;
 +    padding: 0 6px; }
 +    .message .message-header:ltr {
 +      padding-right: 0; }
 +    .message .message-header:rtl {
 +      padding-left: 0; }
 +    .message .message-header .message-source-icon {
 +      icon-size: 1.091em;
 +      -st-icon-style: symbolic; }
 +    .message .message-header .message-header-content {
 +      spacing: 6px;
 +      min-height: 1.637em;
 +      padding-bottom: 6px; }
 +      .message .message-header .message-header-content .message-source-title {
 +        font-weight: bold; }
 +      .message .message-header .message-header-content .event-time {
-       color: #282828; }
++        color: #78787b;
 +        padding-bottom: 0.068em; }
 +        .message .message-header .message-header-content .event-time:ltr {
 +          text-align: right; }
 +        .message .message-header .message-header-content .event-time:rtl {
 +          text-align: left; }
 +    .message .message-header .message-expand-button,
 +    .message .message-header .message-close-button {
 +      border-radius: 999px;
-         background-color: rgba(40, 40, 40, 0.07);
++      color: #222226; }
 +    .message .message-header .message-expand-button {
 +      padding: 6px; }
 +    .message .message-header .message-close-button {
 +      margin: 3px;
 +      padding: 4px; }
 +  .message .message-box {
 +    padding: 6px;
 +    margin-top: 0;
 +    spacing: 6px; }
 +    .message .message-box .message-icon {
 +      icon-size: 48px; }
 +      .message .message-box .message-icon:ltr {
 +        margin-right: 6px; }
 +      .message .message-box .message-icon:rtl {
 +        margin-left: 6px; }
 +      .message .message-box .message-icon.message-themed-icon {
 +        border-radius: 999px;
-   color: #282828;
++        background-color: rgba(34, 34, 38, 0.07);
 +        icon-size: 1.091em;
 +        min-width: 48px;
 +        min-height: 48px; }
 +    .message .message-box:first-child {
 +      margin-top: 12px; }
 +    .message .message-box .message-content {
 +      spacing: 4px; }
 +      .message .message-box .message-content .message-title {
 +        font-weight: bold; }
 +  .message .message-action-bin {
 +    padding: 4px;
 +    spacing: 6px; }
 +    .message .message-action-bin * {
 +      margin: 0 4px; }
 +      .message .message-action-bin *:first-child:ltr {
 +        margin-left: 0; }
 +      .message .message-action-bin *:first-child:rtl {
 +        margin-right: 0; }
 +      .message .message-action-bin *:last-child:ltr {
 +        margin-right: 0; }
 +      .message .message-action-bin *:last-child:rtl {
 +        margin-left: 0; }
 +
 +.url-highlighter {
 +  link-color: st-darken(-st-accent-color, 10%); }
 +
 +/* Media Controls */
 +.message-media-control {
 +  padding: 0 18px;
 +  border-radius: 8px;
-     background-color: #ebebeb;
-     color: #282828; }
++  color: #222226;
 +  border: 1px solid transparent; }
 +  .message-media-control:hover {
-     background-color: #e6e6e6;
-     color: #282828; }
++    background-color: #efeff2;
++    color: #222226; }
 +  .message-media-control:active {
-     color: #878787; }
++    background-color: #e9e9ed;
++    color: #222226; }
 +  .message-media-control:insensitive {
-   color: #7a7a7a; }
++    color: #858588; }
 +  .message-media-control StIcon {
 +    icon-size: 16px; }
 +
 +.media-message .message-icon {
 +  border-radius: 8px !important; }
 +  .media-message .message-icon.message-themed-icon {
 +    icon-size: 32px !important; }
 +
 +.candidate-popup-content {
 +  padding: 6px;
 +  spacing: 6px;
 +  border-radius: 12px; }
 +
 +.candidate-index {
 +  padding: 0;
 +  padding-right: 6px;
-     background-color: #dedede;
-     color: #111111; }
++  color: #78787b; }
 +
 +.candidate-box {
 +  padding: 6px 12px 6px 12px;
 +  border-radius: 8px; }
 +  .candidate-box:selected {
 +    background-color: -st-accent-color;
 +    color: -st-accent-fg-color; }
 +  .candidate-box:hover {
-   background-color: whitesmoke;
++    background-color: #e1e1e7;
++    color: #0c0c0e; }
 +
 +.candidate-page-button-box {
 +  height: 2em; }
 +  .vertical .candidate-page-button-box {
 +    padding-top: 12px; }
 +  .horizontal .candidate-page-button-box {
 +    padding-left: 12px; }
 +
 +.candidate-page-button {
 +  padding: 6px; }
 +  .candidate-page-button StIcon {
 +    icon-size: 16px; }
 +
 +.candidate-page-button-previous {
 +  border-radius: 8px 0px 0px 8px;
 +  border-right-width: 0;
 +  box-shadow: none; }
 +
 +.candidate-page-button-next {
 +  border-radius: 0px 8px 8px 0px;
 +  box-shadow: none; }
 +
 +/* Notifications & Message Tray */
 +.notification-banner {
 +  min-height: 64px;
 +  width: 34em;
 +  box-shadow: 0 2px 4px 2px rgba(0, 0, 0, 0.05);
 +  border-radius: 16px;
 +  margin: 4px; }
 +
 +.notification-buttons-bin {
 +  spacing: 0; }
 +
 +/* Modal Dialogs */
 +.modal-dialog {
-         color: #1b1b1b; }
++  background-color: #fafafb;
 +  border-radius: 18px;
 +  padding: 24px;
 +  spacing: 18px;
 +  box-shadow: 0 12px 8px 12px rgba(0, 0, 0, 0.03); }
 +  .modal-dialog .modal-dialog-content-box {
 +    padding-top: 12px;
 +    spacing: 18px;
 +    max-width: 28em; }
 +  .modal-dialog .modal-dialog-button-box {
 +    padding-top: 6px; }
 +
 +.dialog-list {
 +  spacing: 18px; }
 +  .dialog-list .dialog-list-title {
 +    text-align: center; }
 +  .dialog-list .dialog-list-scrollview {
 +    max-height: 200px; }
 +  .dialog-list .dialog-list-box {
 +    spacing: 1em; }
 +    .dialog-list .dialog-list-box .dialog-list-item {
 +      spacing: 1em; }
 +      .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-title {
 +        font-weight: bold; }
 +      .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description {
-     color: #f5c211;
-     background-color: rgba(245, 194, 17, 0.1);
++        color: #161619; }
 +
 +/* End Session Dialog */
 +.end-session-dialog {
 +  width: 24em; }
 +  .end-session-dialog .end-session-dialog-battery-warning,
 +  .end-session-dialog .dialog-list-title {
-     color: #f5c211; }
++    color: #e5a50a;
++    background-color: rgba(229, 165, 10, 0.1);
 +    padding: 9px;
 +    border-radius: 8px;
 +    margin: 4px 0; }
 +
 +/* Message Dialog */
 +.message-dialog-content {
 +  spacing: 18px; }
 +  .message-dialog-content .message-dialog-title {
 +    text-align: center; }
 +  .message-dialog-content .message-dialog-description {
 +    text-align: center; }
 +
 +/* Run Dialog */
 +.run-dialog {
 +  width: 24em;
 +  padding-bottom: 6px; }
 +  .run-dialog .run-dialog-entry {
 +    padding: 12px 9px; }
 +  .run-dialog .run-dialog-description {
 +    color: black; }
 +
 +/* Password or Authentication Dialog */
 +.prompt-dialog {
 +  width: 28em; }
 +  .prompt-dialog .prompt-dialog-password-grid {
 +    spacing-rows: 8px;
 +    spacing-columns: 4px; }
 +    .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry {
 +      width: auto; }
 +      .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry:ltr {
 +        margin-left: 20px; }
 +      .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry:rtl {
 +        margin-right: 20px; }
 +  .prompt-dialog .prompt-dialog-password-layout {
 +    spacing: 8px; }
 +  .prompt-dialog .prompt-dialog-password-entry {
 +    width: 20em;
 +    padding: 12px 9px; }
 +  .prompt-dialog .prompt-dialog-error-label,
 +  .prompt-dialog .prompt-dialog-info-label,
 +  .prompt-dialog .prompt-dialog-null-label {
 +    text-align: center; }
 +  .prompt-dialog .prompt-dialog-error-label {
-     color: #f5c211; }
++    color: #e5a50a; }
 +
 +/* Polkit Dialog */
 +.polkit-dialog-user-layout {
 +  text-align: center;
 +  spacing: 8px;
 +  margin-bottom: 6px; }
 +  .polkit-dialog-user-layout .polkit-dialog-user-root-label {
-       background-color: #353535; }
++    color: #e5a50a; }
 +
 +/* Audio selection dialog */
 +.audio-device-selection-dialog {
 +  min-width: 24em; }
 +  .audio-device-selection-dialog .audio-selection-box {
 +    spacing: 12px; }
 +    .audio-device-selection-dialog .audio-selection-box .audio-selection-device {
 +      color: #ffffff;
-         box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-         background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); }
++      background-color: #2e2e33;
++      background-color: transparent; }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device:focus {
 +        color: #ffffff;
-           background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); }
++        box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++        background-color: st-mix(-st-accent-color, rgba(46, 46, 51, 0.25), 5%); }
 +        .audio-device-selection-dialog .audio-selection-box .audio-selection-device:focus:hover {
-         background-color: st-lighten(#353535, 7%); }
++          background-color: st-mix(-st-accent-color, st-lighten(#2e2e33, 7%), 5%); }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device:hover {
 +        color: #ffffff;
-         background-color: st-lighten(#353535, 9%); }
++        background-color: st-lighten(#2e2e33, 7%); }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active {
 +        color: #ffffff;
-           background-color: st-lighten(st-lighten(#353535, 9%), 7%); }
++        background-color: st-lighten(#2e2e33, 9%); }
 +        .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active:hover {
-           background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); }
++          background-color: st-lighten(st-lighten(#2e2e33, 9%), 7%); }
 +        .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active:focus {
-         background-color: st-lighten(#353535, 8%); }
++          background-color: st-mix(-st-accent-color, st-lighten(#2e2e33, 9%), 5%); }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked {
 +        color: #ffffff;
-           background-color: st-lighten(st-lighten(#353535, 8%), 7%); }
++        background-color: st-lighten(#2e2e33, 8%); }
 +        .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted:hover, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected:hover, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked:hover {
-           background-color: st-lighten(st-lighten(#353535, 8%), 9%); }
++          background-color: st-lighten(st-lighten(#2e2e33, 8%), 7%); }
 +        .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted:active, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected:active, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked:active {
-         background-color: #353535; }
++          background-color: st-lighten(st-lighten(#2e2e33, 8%), 9%); }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device:insensitive {
 +        color: st-transparentize(#ffffff, 0.6);
- .osd-monitor-label {
++        background-color: #2e2e33; }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device:drop {
 +        background-color: st-transparentize(-st-accent-color, 0.8);
 +        box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device .audio-selection-device-box {
 +        padding: 12px;
 +        spacing: 12px; }
 +      .audio-device-selection-dialog .audio-selection-box .audio-selection-device .audio-selection-device-icon {
 +        icon-size: 64px; }
 +
 +/* Welcome dialog */
 +.welcome-dialog-image {
 +  background-image: url("resource:///org/gnome/shell/theme/gnome-shell-start.svg");
 +  background-size: contain;
 +  /* Reasonable maximum dimensions */
 +  height: 300px;
 +  width: 300px; }
 +
 +/* Access portal dialog */
 +.access-dialog {
 +  text-align: center; }
 +
 +/* OSD */
 +.osd-window {
 +  text-align: center;
 +  font-weight: bold;
 +  spacing: 12px;
 +  padding: 12px 18px;
 +  margin-bottom: 4em; }
 +  .osd-window > * {
 +    spacing: 8px; }
 +  .osd-window StIcon {
 +    icon-size: 32px; }
 +  .osd-window StLabel:ltr {
 +    margin-right: 6px; }
 +  .osd-window StLabel:rtl {
 +    margin-left: 6px; }
 +  .osd-window .level {
 +    margin-bottom: 4px;
 +    min-width: 160px;
 +    -barlevel-height: 6px;
 +    -barlevel-background-color: rgba(255, 255, 255, 0.3);
 +    -barlevel-active-background-color: #ffffff;
 +    -barlevel-overdrive-color: #e01b24;
 +    -barlevel-overdrive-separator-width: 3px; }
 +    .osd-window .level:first-child {
 +      margin-bottom: 0; }
 +    .osd-window .level:ltr {
 +      margin-right: 6px; }
 +    .osd-window .level:rtl {
 +      margin-left: 6px; }
 +
-     background-color: #353535; }
++.osd-monitor-label, .osd-break-countdown-label {
 +  background-color: -st-accent-color;
 +  color: -st-accent-fg-color;
 +  border-radius: 16px;
 +  font-size: 3em;
 +  font-weight: bold;
 +  font-feature-settings: "tnum";
 +  margin: 12px;
 +  padding: 12px;
 +  text-align: center;
 +  min-width: 1.5em; }
 +
 +/* Pad OSD */
 +.pad-osd-window {
 +  padding: 32px;
 +  background-color: rgba(0, 0, 0, 0.8); }
 +  .pad-osd-window .pad-osd-title-box {
 +    spacing: 12px; }
 +  .pad-osd-window .pad-osd-title-menu-box {
 +    spacing: 6px; }
 +
 +.combo-box-label {
 +  width: 15em; }
 +
 +/* App Switcher */
 +.switcher-popup {
 +  padding: 0;
 +  spacing: 24px; }
 +
 +.switcher-list {
 +  padding: 12px;
 +  border-radius: 28px;
 +  box-shadow: 0 8px 8px 0 rgba(0, 0, 0, 0.05); }
 +  .switcher-list .switcher-list-item-container {
 +    spacing: 12px; }
 +  .switcher-list .item-box {
 +    color: #ffffff;
-       box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-       background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); }
++    background-color: #2e2e33;
++    background-color: transparent; }
 +    .switcher-list .item-box:focus {
 +      color: #ffffff;
-         background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); }
++      box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++      background-color: st-mix(-st-accent-color, rgba(46, 46, 51, 0.25), 5%); }
 +      .switcher-list .item-box:focus:hover {
-       background-color: st-lighten(#353535, 7%); }
++        background-color: st-mix(-st-accent-color, st-lighten(#2e2e33, 7%), 5%); }
 +    .switcher-list .item-box:hover {
 +      color: #ffffff;
-       background-color: st-lighten(#353535, 9%); }
++      background-color: st-lighten(#2e2e33, 7%); }
 +    .switcher-list .item-box:active {
 +      color: #ffffff;
-         background-color: st-lighten(st-lighten(#353535, 9%), 7%); }
++      background-color: st-lighten(#2e2e33, 9%); }
 +      .switcher-list .item-box:active:hover {
-         background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); }
++        background-color: st-lighten(st-lighten(#2e2e33, 9%), 7%); }
 +      .switcher-list .item-box:active:focus {
-       background-color: st-lighten(#353535, 8%); }
++        background-color: st-mix(-st-accent-color, st-lighten(#2e2e33, 9%), 5%); }
 +    .switcher-list .item-box:highlighted, .switcher-list .item-box:selected, .switcher-list .item-box:checked {
 +      color: #ffffff;
-         background-color: st-lighten(st-lighten(#353535, 8%), 7%); }
++      background-color: st-lighten(#2e2e33, 8%); }
 +      .switcher-list .item-box:highlighted:hover, .switcher-list .item-box:selected:hover, .switcher-list .item-box:checked:hover {
-         background-color: st-lighten(st-lighten(#353535, 8%), 9%); }
++        background-color: st-lighten(st-lighten(#2e2e33, 8%), 7%); }
 +      .switcher-list .item-box:highlighted:active, .switcher-list .item-box:selected:active, .switcher-list .item-box:checked:active {
-       background-color: #353535; }
++        background-color: st-lighten(st-lighten(#2e2e33, 8%), 9%); }
 +    .switcher-list .item-box:insensitive {
 +      color: st-transparentize(#ffffff, 0.6);
-     background: rgba(40, 40, 40, 0.15); }
++      background-color: #2e2e33; }
 +    .switcher-list .item-box:drop {
 +      background-color: st-transparentize(-st-accent-color, 0.8);
 +      box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
 +    .switcher-list .item-box:hover {
 +      background: none; }
 +    .switcher-list .item-box:selected {
 +      background-color: rgba(255, 255, 255, 0.2); }
 +  .switcher-list .separator {
 +    width: 1px;
-       background-color: #dedede; }
++    background: rgba(34, 34, 38, 0.15); }
 +  .switcher-list .thumbnail-box {
 +    padding: 2px;
 +    spacing: 6px; }
 +  .switcher-list .thumbnail {
 +    width: 256px;
 +    border-radius: 8px; }
 +
 +.switcher-arrow {
 +  border-color: rgba(255, 255, 255, 0.8);
 +  color: rgba(255, 255, 255, 0.8); }
 +  .switcher-arrow:highlighted {
 +    border-color: #ffffff;
 +    color: #ffffff; }
 +
 +.input-source-switcher-symbol {
 +  font-size: 34pt;
 +  width: 96px;
 +  height: 96px; }
 +
 +.cycler-highlight {
 +  border: 5px solid -st-accent-color; }
 +
 +/* Workspace Switcher */
 +.workspace-switcher {
 +  margin-bottom: 4em;
 +  spacing: 12px;
 +  padding: 12px 18px; }
 +
 +.ws-switcher-indicator {
 +  background-color: rgba(255, 255, 255, 0.5);
 +  padding: 2.6666666667px;
 +  margin: 13.3333333333px;
 +  border-radius: 32px; }
 +  .ws-switcher-indicator:active {
 +    background-color: #ffffff;
 +    padding: 5.3333333333px;
 +    margin: 10.6666666667px; }
 +
 +.screenshot-ui-panel {
 +  border-radius: 32px;
 +  padding: 18px;
 +  padding-bottom: 12px;
 +  margin-bottom: 4em;
 +  spacing: 12px; }
 +
 +.screenshot-ui-close-button {
 +  padding: 6px !important;
 +  margin-top: 12px;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05); }
 +  .screenshot-ui-close-button.left {
 +    margin-left: 12px; }
 +  .screenshot-ui-close-button.right {
 +    margin-right: 12px; }
 +
 +.screenshot-ui-type-button {
 +  min-width: 48px;
 +  padding: 12px 18px;
 +  border-radius: 14px; }
 +  .screenshot-ui-type-button .icon-label-button-container {
 +    spacing: 0.409em; }
 +    .screenshot-ui-type-button .icon-label-button-container > StIcon {
 +      icon-size: 32px; }
 +
 +.screenshot-ui-capture-button {
 +  width: 32px;
 +  height: 32px;
 +  border-radius: 999px;
 +  border: 4px #ffffff;
 +  padding: 4px; }
 +  .screenshot-ui-capture-button .screenshot-ui-capture-button-circle {
 +    background-color: #ffffff;
 +    transition-duration: 200ms;
 +    border-radius: 999px; }
 +    .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:hover, .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:focus {
-     color: #353535; }
++      background-color: #e1e1e7; }
 +  .screenshot-ui-capture-button:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:focus .screenshot-ui-capture-button-circle {
 +    background-color: #cccccc; }
 +  .screenshot-ui-capture-button:active .screenshot-ui-capture-button-circle {
 +    background-color: gray; }
 +  .screenshot-ui-capture-button:cast .screenshot-ui-capture-button-circle {
 +    background-color: #c01c28; }
 +  .screenshot-ui-capture-button:cast:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:cast:focus .screenshot-ui-capture-button-circle {
 +    background-color: #d61f2d; }
 +  .screenshot-ui-capture-button:cast:active .screenshot-ui-capture-button-circle {
 +    background-color: #a11722; }
 +
 +.screenshot-ui-shot-cast-container {
 +  background-color: rgba(255, 255, 255, 0.1);
 +  border-radius: 999px;
 +  padding: 3px;
 +  spacing: 3px; }
 +
 +.screenshot-ui-shot-cast-button {
 +  padding: 6px 12px;
 +  background-color: transparent;
 +  border-radius: 999px; }
 +  .screenshot-ui-shot-cast-button > StIcon {
 +    icon-size: 16px; }
 +  .screenshot-ui-shot-cast-button:hover, .screenshot-ui-shot-cast-button:focus {
 +    background-color: rgba(255, 255, 255, 0.2); }
 +  .screenshot-ui-shot-cast-button:active {
 +    background-color: rgba(255, 255, 255, 0.5); }
 +  .screenshot-ui-shot-cast-button:checked {
 +    background-color: #ffffff;
-   background-color: #282828; }
++    color: #2e2e33; }
 +  .screenshot-ui-shot-cast-button:insensitive {
 +    color: rgba(255, 255, 255, 0.5); }
 +
 +.screenshot-ui-area-indicator-shade {
 +  background-color: rgba(0, 0, 0, 0.3); }
 +
 +.screenshot-ui-area-selector .screenshot-ui-area-indicator-shade {
 +  background-color: rgba(0, 0, 0, 0.5); }
 +
 +.screenshot-ui-area-selector .screenshot-ui-area-indicator-selection {
 +  border: 2px white; }
 +
 +.screenshot-ui-area-selector-handle {
 +  border-radius: 999px;
 +  background-color: white;
 +  box-shadow: 0 1px 3px 2px rgba(0, 0, 0, 0.05);
 +  width: 24px;
 +  height: 24px; }
 +
 +.screenshot-ui-window-selector {
-   background-color: whitesmoke;
++  background-color: #222226; }
 +  .screenshot-ui-window-selector .screenshot-ui-window-selector-window-container {
 +    margin: 100px; }
 +  .screenshot-ui-window-selector:primary-monitor .screenshot-ui-window-selector-window-container {
 +    margin-bottom: 200px; }
 +
 +.screenshot-ui-window-selector-window-border {
 +  transition-duration: 200ms;
 +  border-radius: 16px;
 +  border: 6px transparent; }
 +
 +.screenshot-ui-window-selector-check {
 +  transition-duration: 200ms;
 +  color: transparent;
 +  border-radius: 999px;
 +  border-width: 12px;
 +  icon-size: 24px; }
 +
 +.screenshot-ui-window-selector-window:hover .screenshot-ui-window-selector-window-border {
 +  border-color: st-darken(-st-accent-color, 15%); }
 +
 +.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-window-border {
 +  border-color: -st-accent-color;
 +  background-color: st-transparentize(-st-accent-color, 0.8); }
 +
 +.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-check {
 +  color: -st-accent-fg-color;
 +  background-color: -st-accent-color; }
 +
 +.screenshot-ui-screen-selector {
 +  transition-duration: 200ms;
 +  background-color: rgba(0, 0, 0, 0.5); }
 +  .screenshot-ui-screen-selector:hover {
 +    background-color: rgba(0, 0, 0, 0.3); }
 +  .screenshot-ui-screen-selector:active {
 +    background-color: rgba(0, 0, 0, 0.7); }
 +  .screenshot-ui-screen-selector:checked {
 +    background-color: transparent;
 +    border: 2px white; }
 +
 +.screenshot-ui-tooltip {
 +  text-align: center;
 +  -y-offset: 24px; }
 +
 +/* Top Bar */
 +#panel {
-     color: #282828;
++  background-color: #fafafb;
 +  font-weight: bold;
 +  height: 2.2em;
 +  transition-duration: 250ms; }
 +  #panel .panel-button {
 +    transition-duration: 150ms;
 +    border: 3px solid transparent;
 +    background-color: transparent;
 +    border-radius: 999px;
 +    font-weight: bold;
-       box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.17); }
++    color: #222226;
 +    box-shadow: inset 0 0 0 100px transparent;
 +    -natural-hpadding: 12px;
 +    -minimum-hpadding: 6px; }
 +    #panel .panel-button:focus, #panel .panel-button:hover {
-       box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.28); }
++      box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.17); }
 +    #panel .panel-button:active, #panel .panel-button:checked {
-         box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.32); }
++      box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.28); }
 +      #panel .panel-button:active:hover, #panel .panel-button:checked:hover {
-       background-color: #282828; }
++        box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.32); }
 +    #panel .panel-button .system-status-icon {
 +      icon-size: 1.091em;
 +      padding: 0 6px;
 +      margin: 0 4px; }
 +    #panel .panel-button .app-menu-icon {
 +      -st-icon-style: symbolic; }
 +    #panel .panel-button .panel-status-menu-box,
 +    #panel .panel-button .panel-status-indicators-box {
 +      spacing: 4px; }
 +      #panel .panel-button .panel-status-menu-box > .system-status-icon,
 +      #panel .panel-button .panel-status-indicators-box > .system-status-icon {
 +        padding: 0; }
 +    #panel .panel-button#panelActivities StBoxLayout {
 +      padding: 0 0.2045em;
 +      spacing: 5px; }
 +    #panel .panel-button#panelActivities .workspace-dot {
 +      border-radius: 999px;
 +      min-width: 0.5455em;
 +      min-height: 0.5455em;
-       color: whitesmoke;
++      background-color: #222226; }
 +    #panel .panel-button.screen-recording-indicator StBoxLayout, #panel .panel-button.screen-sharing-indicator StBoxLayout {
 +      spacing: 0.409em; }
 +    #panel .panel-button.screen-recording-indicator StIcon, #panel .panel-button.screen-sharing-indicator StIcon {
 +      icon-size: 1.091em; }
 +    #panel .panel-button.screen-recording-indicator {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
-       color: whitesmoke;
++      color: #fafafb;
 +      box-shadow: inset 0 0 0 100px #c01c28; }
 +      #panel .panel-button.screen-recording-indicator:focus, #panel .panel-button.screen-recording-indicator:hover {
 +        box-shadow: inset 0 0 0 100px #aa1923; }
 +      #panel .panel-button.screen-recording-indicator:active, #panel .panel-button.screen-recording-indicator:checked {
 +        box-shadow: inset 0 0 0 100px #981620; }
 +        #panel .panel-button.screen-recording-indicator:active:hover, #panel .panel-button.screen-recording-indicator:checked:hover {
 +          box-shadow: inset 0 0 0 100px #8f151e; }
 +    #panel .panel-button.screen-sharing-indicator {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
-       color: #282828;
++      color: #fafafb;
 +      box-shadow: inset 0 0 0 100px #e66100; }
 +      #panel .panel-button.screen-sharing-indicator:focus, #panel .panel-button.screen-sharing-indicator:hover {
 +        box-shadow: inset 0 0 0 100px #cd5600; }
 +      #panel .panel-button.screen-sharing-indicator:active, #panel .panel-button.screen-sharing-indicator:checked {
 +        box-shadow: inset 0 0 0 100px #b84e00; }
 +        #panel .panel-button.screen-sharing-indicator:active:hover, #panel .panel-button.screen-sharing-indicator:checked:hover {
 +          box-shadow: inset 0 0 0 100px #ae4900; }
 +    #panel .panel-button.clock-display {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
-         box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.17); }
++      color: #222226;
 +      box-shadow: inset 0 0 0 100px transparent;
 +      background: none !important;
 +      box-shadow: none !important;
 +      border: none !important; }
 +      #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:hover {
-         box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.28); }
++        box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.17); }
 +      #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:checked {
-           box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.32); }
++        box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.28); }
 +        #panel .panel-button.clock-display:active:hover, #panel .panel-button.clock-display:checked:hover {
-         box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.17); }
++          box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.32); }
 +      #panel .panel-button.clock-display .clock {
 +        transition-duration: 150ms;
 +        border: 3px solid transparent;
 +        border-radius: 999px; }
 +      #panel .panel-button.clock-display:focus .clock, #panel .panel-button.clock-display:hover .clock {
-         box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.28); }
++        box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.17); }
 +      #panel .panel-button.clock-display:active .clock, #panel .panel-button.clock-display:checked .clock {
-           box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.32); }
++        box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.28); }
 +        #panel .panel-button.clock-display:active .clock:hover, #panel .panel-button.clock-display:checked .clock:hover {
-       color: whitesmoke;
++          box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.32); }
 +      #panel .panel-button.clock-display .messages-indicator {
 +        icon-size: 1.091em; }
 +  #panel:overview, #panel.unlock-screen, #panel.login-screen {
 +    background-color: transparent; }
 +    #panel:overview .panel-button.screen-recording-indicator, #panel.unlock-screen .panel-button.screen-recording-indicator, #panel.login-screen .panel-button.screen-recording-indicator {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
-       color: whitesmoke;
++      color: #fafafb;
 +      box-shadow: inset 0 0 0 100px #c01c28; }
 +      #panel:overview .panel-button.screen-recording-indicator:focus, #panel:overview .panel-button.screen-recording-indicator:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:focus, #panel.unlock-screen .panel-button.screen-recording-indicator:hover, #panel.login-screen .panel-button.screen-recording-indicator:focus, #panel.login-screen .panel-button.screen-recording-indicator:hover {
 +        box-shadow: inset 0 0 0 100px #aa1923; }
 +      #panel:overview .panel-button.screen-recording-indicator:active, #panel:overview .panel-button.screen-recording-indicator:checked, #panel.unlock-screen .panel-button.screen-recording-indicator:active, #panel.unlock-screen .panel-button.screen-recording-indicator:checked, #panel.login-screen .panel-button.screen-recording-indicator:active, #panel.login-screen .panel-button.screen-recording-indicator:checked {
 +        box-shadow: inset 0 0 0 100px #981620; }
 +        #panel:overview .panel-button.screen-recording-indicator:active:hover, #panel:overview .panel-button.screen-recording-indicator:checked:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:active:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:checked:hover, #panel.login-screen .panel-button.screen-recording-indicator:active:hover, #panel.login-screen .panel-button.screen-recording-indicator:checked:hover {
 +          box-shadow: inset 0 0 0 100px #8f151e; }
 +    #panel:overview .panel-button.screen-sharing-indicator, #panel.unlock-screen .panel-button.screen-sharing-indicator, #panel.login-screen .panel-button.screen-sharing-indicator {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
-     color: whitesmoke;
++      color: #fafafb;
 +      box-shadow: inset 0 0 0 100px #e66100; }
 +      #panel:overview .panel-button.screen-sharing-indicator:focus, #panel:overview .panel-button.screen-sharing-indicator:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:focus, #panel.unlock-screen .panel-button.screen-sharing-indicator:hover, #panel.login-screen .panel-button.screen-sharing-indicator:focus, #panel.login-screen .panel-button.screen-sharing-indicator:hover {
 +        box-shadow: inset 0 0 0 100px #cd5600; }
 +      #panel:overview .panel-button.screen-sharing-indicator:active, #panel:overview .panel-button.screen-sharing-indicator:checked, #panel.unlock-screen .panel-button.screen-sharing-indicator:active, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked, #panel.login-screen .panel-button.screen-sharing-indicator:active, #panel.login-screen .panel-button.screen-sharing-indicator:checked {
 +        box-shadow: inset 0 0 0 100px #b84e00; }
 +        #panel:overview .panel-button.screen-sharing-indicator:active:hover, #panel:overview .panel-button.screen-sharing-indicator:checked:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:active:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked:hover, #panel.login-screen .panel-button.screen-sharing-indicator:active:hover, #panel.login-screen .panel-button.screen-sharing-indicator:checked:hover {
 +          box-shadow: inset 0 0 0 100px #ae4900; }
 +  #panel.unlock-screen .panel-button, #panel.login-screen .panel-button {
 +    transition-duration: 150ms;
 +    border: 3px solid transparent;
 +    background-color: transparent;
 +    border-radius: 999px;
 +    font-weight: bold;
 +    color: #ffffff;
 +    box-shadow: inset 0 0 0 100px transparent; }
 +    #panel.unlock-screen .panel-button:focus, #panel.unlock-screen .panel-button:hover, #panel.login-screen .panel-button:focus, #panel.login-screen .panel-button:hover {
 +      box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
 +    #panel.unlock-screen .panel-button:active, #panel.unlock-screen .panel-button:checked, #panel.login-screen .panel-button:active, #panel.login-screen .panel-button:checked {
 +      box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
 +      #panel.unlock-screen .panel-button:active:hover, #panel.unlock-screen .panel-button:checked:hover, #panel.login-screen .panel-button:active:hover, #panel.login-screen .panel-button:checked:hover {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
 +    #panel.unlock-screen .panel-button.clock-display, #panel.login-screen .panel-button.clock-display {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
 +      color: #ffffff;
 +      box-shadow: inset 0 0 0 100px transparent;
 +      background: none !important;
 +      box-shadow: none !important;
 +      border: none !important; }
 +      #panel.unlock-screen .panel-button.clock-display:focus, #panel.unlock-screen .panel-button.clock-display:hover, #panel.login-screen .panel-button.clock-display:focus, #panel.login-screen .panel-button.clock-display:hover {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
 +      #panel.unlock-screen .panel-button.clock-display:active, #panel.unlock-screen .panel-button.clock-display:checked, #panel.login-screen .panel-button.clock-display:active, #panel.login-screen .panel-button.clock-display:checked {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
 +        #panel.unlock-screen .panel-button.clock-display:active:hover, #panel.unlock-screen .panel-button.clock-display:checked:hover, #panel.login-screen .panel-button.clock-display:active:hover, #panel.login-screen .panel-button.clock-display:checked:hover {
 +          box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
 +      #panel.unlock-screen .panel-button.clock-display .clock, #panel.login-screen .panel-button.clock-display .clock {
 +        transition-duration: 150ms;
 +        border: 3px solid transparent;
 +        border-radius: 999px; }
 +      #panel.unlock-screen .panel-button.clock-display:focus .clock, #panel.unlock-screen .panel-button.clock-display:hover .clock, #panel.login-screen .panel-button.clock-display:focus .clock, #panel.login-screen .panel-button.clock-display:hover .clock {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
 +      #panel.unlock-screen .panel-button.clock-display:active .clock, #panel.unlock-screen .panel-button.clock-display:checked .clock, #panel.login-screen .panel-button.clock-display:active .clock, #panel.login-screen .panel-button.clock-display:checked .clock {
 +        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
 +        #panel.unlock-screen .panel-button.clock-display:active .clock:hover, #panel.unlock-screen .panel-button.clock-display:checked .clock:hover, #panel.login-screen .panel-button.clock-display:active .clock:hover, #panel.login-screen .panel-button.clock-display:checked .clock:hover {
 +          box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
 +  #panel:overview .panel-button {
 +    transition-duration: 150ms;
 +    border: 3px solid transparent;
 +    background-color: transparent;
 +    border-radius: 999px;
 +    font-weight: bold;
-       box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.17); }
++    color: #fafafb;
 +    box-shadow: inset 0 0 0 100px transparent; }
 +    #panel:overview .panel-button:focus, #panel:overview .panel-button:hover {
-       box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.28); }
++      box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.17); }
 +    #panel:overview .panel-button:active, #panel:overview .panel-button:checked {
-         box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.32); }
++      box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.28); }
 +      #panel:overview .panel-button:active:hover, #panel:overview .panel-button:checked:hover {
-       background-color: whitesmoke; }
++        box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.32); }
 +    #panel:overview .panel-button#panelActivities .workspace-dot {
-       color: whitesmoke;
++      background-color: #fafafb; }
 +    #panel:overview .panel-button.clock-display {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      background-color: transparent;
 +      border-radius: 999px;
 +      font-weight: bold;
-         box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.17); }
++      color: #fafafb;
 +      box-shadow: inset 0 0 0 100px transparent;
 +      background: none !important;
 +      box-shadow: none !important;
 +      border: none !important; }
 +      #panel:overview .panel-button.clock-display:focus, #panel:overview .panel-button.clock-display:hover {
-         box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.28); }
++        box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.17); }
 +      #panel:overview .panel-button.clock-display:active, #panel:overview .panel-button.clock-display:checked {
-           box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.32); }
++        box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.28); }
 +        #panel:overview .panel-button.clock-display:active:hover, #panel:overview .panel-button.clock-display:checked:hover {
-         box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.17); }
++          box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.32); }
 +      #panel:overview .panel-button.clock-display .clock {
 +        transition-duration: 150ms;
 +        border: 3px solid transparent;
 +        border-radius: 999px; }
 +      #panel:overview .panel-button.clock-display:focus .clock, #panel:overview .panel-button.clock-display:hover .clock {
-         box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.28); }
++        box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.17); }
 +      #panel:overview .panel-button.clock-display:active .clock, #panel:overview .panel-button.clock-display:checked .clock {
-           box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.32); }
++        box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.28); }
 +        #panel:overview .panel-button.clock-display:active .clock:hover, #panel:overview .panel-button.clock-display:checked .clock:hover {
- .quick-toggle, .quick-menu-toggle {
++          box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.32); }
 +  #panel .panel-status-indicators-box,
 +  #panel .panel-status-menu-box {
 +    spacing: 2px; }
 +  #panel .power-status.panel-status-indicators-box {
 +    spacing: 0; }
 +  #panel .privacy-indicator {
 +    color: #e66100; }
 +
 +#appMenu {
 +  spacing: 0.409em; }
 +  #appMenu .label-shadow {
 +    color: transparent; }
 +
 +#appMenu .panel-status-menu-box {
 +  padding: 0 0.409em;
 +  spacing: 0.409em; }
 +
 +.clock-display-box {
 +  spacing: 2px; }
 +  .clock-display-box .clock {
 +    padding-left: 0.818em;
 +    padding-right: 0.818em; }
 +
 +/* Activities Ripple */
 +.ripple-box {
 +  background-color: rgba(255, 255, 255, 0.2);
 +  box-shadow: 0 0 2px 2px rgba(255, 255, 255, 0.2);
 +  width: 52px;
 +  height: 52px;
 +  border-radius: 0 0 52px 0; }
 +  .ripple-box:rtl {
 +    border-radius: 0 0 0 52px; }
 +
 +.quick-settings {
 +  padding: 18px;
 +  border-radius: 36px; }
 +  .quick-settings .icon-button, .quick-settings .login-dialog-button.cancel-button, .quick-settings .login-dialog-button.switch-user-button, .quick-settings .login-dialog-button.login-dialog-session-list-button, .quick-settings .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-settings .pager-button, .quick-settings .message .message-header .message-expand-button, .message .message-header .quick-settings .message-expand-button,
 +  .quick-settings .message .message-header .message-close-button,
 +  .message .message-header .quick-settings .message-close-button, .quick-settings .screenshot-ui-show-pointer-button, .quick-settings .button {
 +    padding: 10.5px; }
 +
 +.quick-settings-grid {
 +  spacing-rows: 12px;
 +  spacing-columns: 12px; }
 +
-   min-height: 3.273em;
-   border: none; }
++.quick-toggle, .quick-toggle-has-menu {
 +  border-radius: 999px;
 +  min-width: 12em;
 +  max-width: 12em;
-   background-color: none;
++  min-height: 3.273em; }
 +
 +.quick-toggle {
-   .quick-toggle .quick-toggle-title {
-     font-weight: bold; }
-   .quick-toggle StBoxLayout > .quick-toggle-subtitle {
 +  /* Move padding into the box; this is to allow menu arrows
 +     to extend to the border */ }
 +  .quick-toggle > StBoxLayout {
 +    spacing: 9px; }
 +  .quick-toggle.button {
 +    padding: 0; }
 +  .quick-toggle > StBoxLayout {
 +    padding: 0 12px; }
 +  .quick-toggle:ltr > StBoxLayout {
 +    padding-left: 15px; }
 +  .quick-toggle:rtl > StBoxLayout {
 +    padding-right: 15px; }
- .quick-menu-toggle .quick-toggle {
++  .quick-toggle .quick-toggle-subtitle {
 +    font-weight: normal; }
 +  .quick-toggle .quick-toggle-icon {
 +    icon-size: 1.091em; }
 +
-   .quick-menu-toggle .quick-toggle:ltr {
++.quick-toggle-has-menu .quick-toggle {
 +  min-width: auto;
 +  max-width: auto; }
-   .quick-menu-toggle .quick-toggle:ltr > StBoxLayout {
-     padding-right: 0.6135em; }
-   .quick-menu-toggle .quick-toggle:rtl {
++  .quick-toggle-has-menu .quick-toggle:ltr {
 +    border-radius: 999px 0 0 999px; }
-   .quick-menu-toggle .quick-toggle:rtr > StBoxLayout {
-     padding-left: 0.6135em; }
-   .quick-menu-toggle .quick-toggle:ltr:last-child {
++    .quick-toggle-has-menu .quick-toggle:ltr > StBoxLayout {
++      padding-right: 0.6135em; }
++  .quick-toggle-has-menu .quick-toggle:rtl {
 +    border-radius: 0 999px 999px 0; }
-   .quick-menu-toggle .quick-toggle:rtl:last-child {
++    .quick-toggle-has-menu .quick-toggle:rtl > StBoxLayout {
++      padding-left: 0.6135em; }
++  .quick-toggle-has-menu .quick-toggle:ltr:last-child {
 +    border-radius: 999px; }
- .quick-menu-toggle .quick-toggle-arrow {
-   padding: 0.409em 0.71575em;
-   border-width: 0;
-   border-color: rgba(40, 40, 40, 0.25); }
-   .quick-menu-toggle .quick-toggle-arrow:checked {
-     border-color: st-darken(-st-accent-color, 15%); }
-   .quick-menu-toggle .quick-toggle-arrow:ltr {
-     border-radius: 0 999px 999px 0;
-     border-left-width: 1px; }
-   .quick-menu-toggle .quick-toggle-arrow:rtl {
-     border-radius: 999px 0 0 999px;
-     border-right-width: 1px; }
++  .quick-toggle-has-menu .quick-toggle:rtl:last-child {
 +    border-radius: 999px; }
 +
-     color: #282828;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, st-mix(#282828, whitesmoke, 12%), 5%); }
++.quick-toggle-has-menu .quick-toggle-menu-button {
++  padding: 0.409em 0.71575em; }
++  .quick-toggle-has-menu .quick-toggle-menu-button:ltr {
++    border-radius: 0 999px 999px 0; }
++  .quick-toggle-has-menu .quick-toggle-menu-button:rtl {
++    border-radius: 999px 0 0 999px; }
++
++.quick-toggle-has-menu .quick-toggle-separator {
++  width: 1px; }
++
++.quick-toggle-has-menu .quick-toggle-menu-button {
++  color: #222226;
++  background-color: st-mix(#222226, #ececf0, 12%); }
++  .quick-toggle-has-menu .quick-toggle-menu-button:focus {
++    color: #222226;
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    background-color: st-mix(-st-accent-color, st-mix(#222226, #ececf0, 12%), 5%); }
++    .quick-toggle-has-menu .quick-toggle-menu-button:focus:hover {
++      background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #ececf0, 12%), 4%), 5%); }
++  .quick-toggle-has-menu .quick-toggle-menu-button:hover {
++    color: #222226;
++    background-color: st-darken(st-mix(#222226, #ececf0, 12%), 4%); }
++  .quick-toggle-has-menu .quick-toggle-menu-button:active {
++    color: #222226;
++    background-color: st-darken(st-mix(#222226, #ececf0, 12%), 9%); }
++    .quick-toggle-has-menu .quick-toggle-menu-button:active:hover {
++      background-color: st-darken(st-darken(st-mix(#222226, #ececf0, 12%), 9%), 4%); }
++    .quick-toggle-has-menu .quick-toggle-menu-button:active:focus {
++      background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #ececf0, 12%), 9%), 5%); }
++  .quick-toggle-has-menu .quick-toggle-menu-button:checked {
++    color: -st-accent-fg-color;
++    background-color: st-mix(-st-accent-color, #222226, 92%); }
++    .quick-toggle-has-menu .quick-toggle-menu-button:checked:focus {
++      color: -st-accent-fg-color;
++      box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++      box-shadow: inset 0 0 0 2px st-transparentize(st-darken(-st-accent-color, 20%), 0.2) !important;
++      background-color: st-mix(-st-accent-color, st-mix(-st-accent-color, #222226, 92%), 5%); }
++      .quick-toggle-has-menu .quick-toggle-menu-button:checked:focus:hover {
++        background-color: st-mix(-st-accent-color, st-darken(st-mix(-st-accent-color, #222226, 92%), 4%), 5%); }
++    .quick-toggle-has-menu .quick-toggle-menu-button:checked:hover {
++      color: -st-accent-fg-color;
++      background-color: st-darken(st-mix(-st-accent-color, #222226, 92%), 4%); }
++    .quick-toggle-has-menu .quick-toggle-menu-button:checked:active {
++      color: -st-accent-fg-color;
++      background-color: st-darken(st-mix(-st-accent-color, #222226, 92%), 9%); }
++      .quick-toggle-has-menu .quick-toggle-menu-button:checked:active:hover {
++        background-color: st-darken(st-darken(st-mix(-st-accent-color, #222226, 92%), 9%), 4%); }
++      .quick-toggle-has-menu .quick-toggle-menu-button:checked:active:focus {
++        background-color: st-mix(-st-accent-color, st-darken(st-mix(-st-accent-color, #222226, 92%), 9%), 5%); }
++
++.quick-toggle-has-menu:checked .quick-toggle-separator {
++  background-color: st-mix(-st-accent-fg-color, -st-accent-color, 20%); }
++
++.quick-toggle-has-menu .quick-toggle-separator {
++  background-color: rgba(34, 34, 38, 0.25); }
 +
 +.quick-slider > StBoxLayout {
 +  spacing: 6px; }
 +
 +.quick-slider .icon-button, .quick-slider .login-dialog-button.cancel-button, .quick-slider .login-dialog-button.switch-user-button, .quick-slider .login-dialog-button.login-dialog-session-list-button, .quick-slider .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-slider .pager-button, .quick-slider .message .message-header .message-expand-button, .message .message-header .quick-slider .message-expand-button,
 +.quick-slider .message .message-header .message-close-button,
 +.message .message-header .quick-slider .message-close-button, .quick-slider .screenshot-ui-show-pointer-button {
 +  padding: 6px; }
 +
 +.quick-slider .slider-bin {
 +  padding: 6px;
 +  border-radius: 999px; }
 +  .quick-slider .slider-bin:focus {
-       background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, whitesmoke, 12%), 4%), 5%); }
++    color: #222226;
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    background-color: st-mix(-st-accent-color, st-mix(#222226, #fafafb, 12%), 5%); }
 +    .quick-slider .slider-bin:focus:hover {
-     color: #282828;
-     background-color: st-mix(#282828, whitesmoke, 12%); }
++      background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #fafafb, 12%), 4%), 5%); }
 +
 +.quick-toggle-menu {
 +  border-radius: 24px;
 +  margin: 12px 18px 0; }
 +  .quick-toggle-menu:insensitive {
-       background-color: rgba(40, 40, 40, 0.2); }
++    color: #222226;
++    background-color: st-mix(#222226, #fafafb, 12%); }
 +  .quick-toggle-menu .popup-menu-item > StIcon {
 +    -st-icon-style: symbolic;
 +    icon-size: 1.091em; }
 +  .quick-toggle-menu .header {
 +    spacing-rows: 3px;
 +    spacing-columns: 12px;
 +    padding-bottom: 12px; }
 +    .quick-toggle-menu .header .icon {
 +      icon-size: 1.6365em;
 +      border-radius: 999px;
 +      padding: 9px;
-     color: #282828;
-     background-color: st-mix(#282828, whitesmoke, 12%);
++      background-color: rgba(34, 34, 38, 0.2); }
 +      .quick-toggle-menu .header .icon.active {
 +        background-color: -st-accent-color;
 +        color: -st-accent-fg-color; }
 +
 +.quick-settings-system-item > StBoxLayout {
 +  spacing: 12px; }
 +
 +.quick-settings-system-item .power-item {
 +  min-height: 0;
 +  min-width: 0; }
 +  .quick-settings-system-item .power-item:insensitive {
-   color: rgba(40, 40, 40, 0.5); }
++    color: #222226;
++    background-color: st-mix(#222226, #fafafb, 12%);
 +    background-color: transparent; }
 +
 +.nm-network-item .wireless-secure-icon {
 +  icon-size: 0.5455em; }
 +
 +.bt-device-item .popup-menu-icon {
 +  -st-icon-style: symbolic; }
 +
 +.bt-menu-placeholder.popup-menu-item {
 +  text-align: center;
 +  padding: 2em 4em; }
 +
 +.device-subtitle {
-   background-color: rgba(40, 40, 40, 0.13); }
++  color: rgba(34, 34, 38, 0.5); }
 +
 +.keyboard-brightness-level {
 +  spacing: 6px; }
 +
 +.background-apps-quick-toggle {
 +  min-height: 2.728em;
 +  background-color: transparent; }
 +  .background-apps-quick-toggle StIcon {
 +    icon-size: 1.091em !important; }
 +
 +.background-app-item .popup-menu-icon {
 +  icon-size: 32px !important;
 +  -st-icon-style: regular !important; }
 +
 +.background-app-item .icon-button, .background-app-item .login-dialog-button.cancel-button, .background-app-item .login-dialog-button.switch-user-button, .background-app-item .login-dialog-button.login-dialog-session-list-button, .background-app-item .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .background-app-item .pager-button, .background-app-item .message .message-header .message-expand-button, .message .message-header .background-app-item .message-expand-button,
 +.background-app-item .message .message-header .message-close-button,
 +.message .message-header .background-app-item .message-close-button, .background-app-item .screenshot-ui-show-pointer-button {
 +  padding: 6px;
-     background-color: rgba(40, 40, 40, 0.22); }
++  background-color: rgba(34, 34, 38, 0.13); }
 +  .background-app-item .icon-button:hover, .background-app-item .login-dialog-button.cancel-button:hover, .background-app-item .login-dialog-button.switch-user-button:hover, .background-app-item .login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .calendar .calendar-month-header .pager-button:hover, .calendar .calendar-month-header .background-app-item .pager-button:hover, .background-app-item .message .message-header .message-expand-button:hover, .message .message-header .background-app-item .message-expand-button:hover,
 +  .background-app-item .message .message-header .message-close-button:hover,
 +  .message .message-header .background-app-item .message-close-button:hover, .background-app-item .screenshot-ui-show-pointer-button:hover {
-     background-color: rgba(40, 40, 40, 0.31); }
++    background-color: rgba(34, 34, 38, 0.22); }
 +  .background-app-item .icon-button:active, .background-app-item .login-dialog-button.cancel-button:active, .background-app-item .login-dialog-button.switch-user-button:active, .background-app-item .login-dialog-button.login-dialog-session-list-button:active, .background-app-item .calendar .calendar-month-header .pager-button:active, .calendar .calendar-month-header .background-app-item .pager-button:active, .background-app-item .message .message-header .message-expand-button:active, .message .message-header .background-app-item .message-expand-button:active,
 +  .background-app-item .message .message-header .message-close-button:active,
 +  .message .message-header .background-app-item .message-close-button:active, .background-app-item .screenshot-ui-show-pointer-button:active {
-   color: #282828; }
++    background-color: rgba(34, 34, 38, 0.31); }
 +
 +.background-app-item .spinner {
 +  padding: 6px; }
 +
 +.background-app-item.popup-inactive-menu-item {
-   background-color: #282828; }
++  color: #222226; }
 +
 +/* OVERVIEW */
 +.secondary-monitor-workspaces {
 +  spacing: 12px; }
 +
 +#overviewGroup {
-   background-color: rgba(71, 71, 71, 0.98);
-   color: whitesmoke;
++  background-color: #222226; }
 +
 +/* Window Picker */
 +.window-picker {
 +  spacing: 6px; }
 +
 +.window-close, .screenshot-ui-close-button {
-     background-color: rgba(88, 88, 88, 0.98); }
++  background-color: rgba(63, 63, 70, 0.98);
++  color: #fafafb;
 +  border-radius: 999px;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05);
 +  padding: 3px;
 +  height: 32px;
 +  width: 32px;
 +  transition-duration: 100ms;
 +  border: 2px solid transparent; }
 +  .window-close StIcon, .screenshot-ui-close-button StIcon {
 +    icon-size: 24px; }
 +  .window-close:hover, .screenshot-ui-close-button:hover {
-     background-color: rgba(104, 104, 104, 0.98); }
++    background-color: rgba(80, 80, 89, 0.98); }
 +  .window-close:active, .screenshot-ui-close-button:active {
-   background-color: #3d3d3d;
-   color: whitesmoke;
++    background-color: rgba(94, 94, 105, 0.98); }
 +
 +.workspace-background {
 +  border-radius: 30px;
 +  background-color: rgba(3, 2, 1, 0);
 +  box-shadow: 0 4px 16px 4px rgba(0, 0, 0, 0.05); }
 +
 +.search-entry {
 +  border-radius: 999px;
 +  margin-top: 12px;
 +  margin-bottom: 6px;
 +  width: 24em; }
 +  .search-entry .search-entry-icon {
 +    icon-size: 1.091em;
 +    margin-top: 2px;
 +    padding: 0 4px; }
 +
 +/* Search */
 +#searchResults {
 +  margin: 0 4px; }
 +
 +#searchResultsContent {
 +  max-width: 1044px; }
 +
 +.search-section {
 +  spacing: 18px; }
 +  .search-section .search-section-separator {
 +    height: 8px;
 +    background-color: transparent; }
 +
 +.search-section-content {
-   color: whitesmoke;
-   background-color: #3d3d3d;
++  background-color: #38383b;
++  color: #fafafb;
 +  border-radius: 24px;
 +  padding: 12px;
 +  margin: 0 12px;
 +  border: 2px solid transparent; }
 +
 +.list-search-result, .search-provider-icon {
-     color: whitesmoke;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, rgba(61, 61, 61, 0.25), 5%); }
++  color: #fafafb;
++  background-color: #38383b;
++  background-color: transparent;
 +  border-radius: 13.2px; }
 +  .list-search-result:focus, .search-provider-icon:focus {
-       background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 7%), 5%); }
++    color: #fafafb;
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    background-color: st-mix(-st-accent-color, rgba(56, 56, 59, 0.25), 5%); }
 +    .list-search-result:focus:hover, .search-provider-icon:focus:hover {
-     color: whitesmoke;
-     background-color: st-lighten(#3d3d3d, 7%); }
++      background-color: st-mix(-st-accent-color, st-lighten(#38383b, 7%), 5%); }
 +  .list-search-result:hover, .search-provider-icon:hover {
-     color: whitesmoke;
-     background-color: st-lighten(#3d3d3d, 9%); }
++    color: #fafafb;
++    background-color: st-lighten(#38383b, 7%); }
 +  .list-search-result:active, .search-provider-icon:active {
-       background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); }
++    color: #fafafb;
++    background-color: st-lighten(#38383b, 9%); }
 +    .list-search-result:active:hover, .search-provider-icon:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); }
++      background-color: st-lighten(st-lighten(#38383b, 9%), 7%); }
 +    .list-search-result:active:focus, .search-provider-icon:active:focus {
-     color: whitesmoke;
-     background-color: st-lighten(#3d3d3d, 8%); }
++      background-color: st-mix(-st-accent-color, st-lighten(#38383b, 9%), 5%); }
 +  .list-search-result:highlighted, .search-provider-icon:highlighted, .list-search-result:selected, .search-provider-icon:selected, .list-search-result:checked, .search-provider-icon:checked {
-       background-color: st-lighten(st-lighten(#3d3d3d, 8%), 7%); }
++    color: #fafafb;
++    background-color: st-lighten(#38383b, 8%); }
 +    .list-search-result:highlighted:hover, .search-provider-icon:highlighted:hover, .list-search-result:selected:hover, .search-provider-icon:selected:hover, .list-search-result:checked:hover, .search-provider-icon:checked:hover {
-       background-color: st-lighten(st-lighten(#3d3d3d, 8%), 9%); }
++      background-color: st-lighten(st-lighten(#38383b, 8%), 7%); }
 +    .list-search-result:highlighted:active, .search-provider-icon:highlighted:active, .list-search-result:selected:active, .search-provider-icon:selected:active, .list-search-result:checked:active, .search-provider-icon:checked:active {
-     color: st-transparentize(whitesmoke, 0.6);
-     background-color: #3d3d3d; }
++      background-color: st-lighten(st-lighten(#38383b, 8%), 9%); }
 +  .list-search-result:insensitive, .search-provider-icon:insensitive {
-   color: rgba(245, 245, 245, 0.8); }
++    color: st-transparentize(#fafafb, 0.6);
++    background-color: #38383b; }
 +  .list-search-result:drop, .search-provider-icon:drop {
 +    background-color: st-transparentize(-st-accent-color, 0.8);
 +    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
 +
 +.search-statustext {
-     color: whitesmoke; }
++  color: rgba(250, 250, 251, 0.8); }
 +
 +.grid-search-results {
 +  spacing: 30px; }
 +
 +.search-provider-icon:ltr {
 +  margin-right: 4px; }
 +
 +.search-provider-icon:rtl {
 +  margin-left: 4px; }
 +
 +.search-provider-icon .list-search-provider-content {
 +  spacing: 12px; }
 +  .search-provider-icon .list-search-provider-content .list-search-provider-details {
 +    width: 120px;
-   color: #959595; }
++    color: #fafafb; }
 +
 +.list-search-results {
 +  spacing: 6px; }
 +
 +.list-search-result .list-search-result-content {
 +  spacing: 6px; }
 +
 +.list-search-result .list-search-result-title {
 +  spacing: 12px; }
 +
 +.list-search-result .list-search-result-description {
-     background-color: #3d3d3d;
++  color: #949497; }
 +
 +/* Dash */
 +#dash {
 +  padding-left: 6px;
 +  padding-right: 6px; }
 +  #dash .dash-background {
-       color: whitesmoke;
-       background-color: #3d3d3d; }
++    background-color: #38383b;
 +    border-radius: 28px;
 +    padding-top: 12px;
 +    padding-bottom: 12px;
 +    padding-left: 10px;
 +    padding-right: 10px; }
 +  #dash .dash-item-container .placeholder {
 +    background-image: none;
 +    background-size: contain;
 +    height: 32px; }
 +  #dash .dash-item-container .empty-dash-drop-target {
 +    width: 32px;
 +    height: 32px; }
 +  #dash .dash-item-container .show-apps,
 +  #dash .dash-item-container .overview-tile,
 +  #dash .dash-item-container .grid-search-result {
 +    margin: 0 2px;
 +    padding-bottom: 12px; }
 +    #dash .dash-item-container .show-apps .overview-icon,
 +    #dash .dash-item-container .overview-tile .overview-icon,
 +    #dash .dash-item-container .grid-search-result .overview-icon {
-       color: whitesmoke;
-       box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-       background-color: st-mix(-st-accent-color, rgba(61, 61, 61, 0.25), 5%); }
++      color: #fafafb;
++      background-color: #38383b; }
 +    #dash .dash-item-container .show-apps:focus .overview-icon,
 +    #dash .dash-item-container .overview-tile:focus .overview-icon,
 +    #dash .dash-item-container .grid-search-result:focus .overview-icon {
-         background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 7%), 5%); }
++      color: #fafafb;
++      box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++      background-color: st-mix(-st-accent-color, rgba(56, 56, 59, 0.25), 5%); }
 +      #dash .dash-item-container .show-apps:focus .overview-icon:hover,
 +      #dash .dash-item-container .overview-tile:focus .overview-icon:hover,
 +      #dash .dash-item-container .grid-search-result:focus .overview-icon:hover {
-       color: whitesmoke;
-       background-color: st-lighten(#3d3d3d, 7%); }
++        background-color: st-mix(-st-accent-color, st-lighten(#38383b, 7%), 5%); }
 +    #dash .dash-item-container .show-apps:hover .overview-icon,
 +    #dash .dash-item-container .overview-tile:hover .overview-icon,
 +    #dash .dash-item-container .grid-search-result:hover .overview-icon {
-       color: whitesmoke;
-       background-color: st-lighten(#3d3d3d, 9%); }
++      color: #fafafb;
++      background-color: st-lighten(#38383b, 7%); }
 +    #dash .dash-item-container .show-apps:active .overview-icon,
 +    #dash .dash-item-container .overview-tile:active .overview-icon,
 +    #dash .dash-item-container .grid-search-result:active .overview-icon {
-         background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); }
++      color: #fafafb;
++      background-color: st-lighten(#38383b, 9%); }
 +      #dash .dash-item-container .show-apps:active .overview-icon:hover,
 +      #dash .dash-item-container .overview-tile:active .overview-icon:hover,
 +      #dash .dash-item-container .grid-search-result:active .overview-icon:hover {
-         background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); }
++        background-color: st-lighten(st-lighten(#38383b, 9%), 7%); }
 +      #dash .dash-item-container .show-apps:active .overview-icon:focus,
 +      #dash .dash-item-container .overview-tile:active .overview-icon:focus,
 +      #dash .dash-item-container .grid-search-result:active .overview-icon:focus {
-       color: whitesmoke;
-       background-color: st-lighten(#3d3d3d, 8%); }
++        background-color: st-mix(-st-accent-color, st-lighten(#38383b, 9%), 5%); }
 +    #dash .dash-item-container .show-apps:checked .overview-icon,
 +    #dash .dash-item-container .overview-tile:checked .overview-icon,
 +    #dash .dash-item-container .grid-search-result:checked .overview-icon {
-         background-color: st-lighten(st-lighten(#3d3d3d, 8%), 7%); }
++      color: #fafafb;
++      background-color: st-lighten(#38383b, 8%); }
 +      #dash .dash-item-container .show-apps:checked .overview-icon:hover,
 +      #dash .dash-item-container .overview-tile:checked .overview-icon:hover,
 +      #dash .dash-item-container .grid-search-result:checked .overview-icon:hover {
-         background-color: st-lighten(st-lighten(#3d3d3d, 8%), 9%); }
++        background-color: st-lighten(st-lighten(#38383b, 8%), 7%); }
 +      #dash .dash-item-container .show-apps:checked .overview-icon:active,
 +      #dash .dash-item-container .overview-tile:checked .overview-icon:active,
 +      #dash .dash-item-container .grid-search-result:checked .overview-icon:active {
-     background-color: rgba(245, 245, 245, 0.1); }
++        background-color: st-lighten(st-lighten(#38383b, 8%), 9%); }
 +  #dash .dash-item-container .app-grid-running-dot {
 +    offset-y: -12px; }
 +  #dash .dash-separator {
 +    width: 1px;
 +    margin-left: 4px;
 +    margin-right: 4px;
-   color: whitesmoke;
-   background-color: #282828;
++    background-color: rgba(250, 250, 251, 0.1); }
 +  #dash .dash-separator,
 +  #dash .dash-background {
 +    margin-bottom: 12px; }
 +
 +.dash-label {
 +  -y-offset: 8px; }
 +
 +/* App Grid */
 +.icon-grid {
 +  row-spacing: 12px;
 +  column-spacing: 12px;
 +  max-row-spacing: 36px;
 +  max-column-spacing: 36px;
 +  page-padding-top: 24px;
 +  page-padding-bottom: 24px;
 +  page-padding-left: 18px;
 +  page-padding-right: 18px; }
 +
 +/* App Icons */
 +.overview-tile, .grid-search-result {
-     color: whitesmoke;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.25), 5%); }
++  color: #fafafb;
++  background-color: #222226;
++  background-color: transparent;
 +  border-radius: 24px;
 +  padding: 12px; }
 +  .overview-tile:focus, .grid-search-result:focus {
-       background-color: st-mix(-st-accent-color, st-lighten(#282828, 7%), 5%); }
++    color: #fafafb;
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.25), 5%); }
 +    .overview-tile:focus:hover, .grid-search-result:focus:hover {
-     color: whitesmoke;
-     background-color: st-lighten(#282828, 7%); }
++      background-color: st-mix(-st-accent-color, st-lighten(#222226, 7%), 5%); }
 +  .overview-tile:hover, .grid-search-result:hover {
-     color: whitesmoke;
-     background-color: st-lighten(#282828, 9%); }
++    color: #fafafb;
++    background-color: st-lighten(#222226, 7%); }
 +  .overview-tile:active, .grid-search-result:active {
-       background-color: st-lighten(st-lighten(#282828, 9%), 7%); }
++    color: #fafafb;
++    background-color: st-lighten(#222226, 9%); }
 +    .overview-tile:active:hover, .grid-search-result:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(#282828, 9%), 5%); }
++      background-color: st-lighten(st-lighten(#222226, 9%), 7%); }
 +    .overview-tile:active:focus, .grid-search-result:active:focus {
-     color: whitesmoke;
-     background-color: st-lighten(#282828, 8%); }
++      background-color: st-mix(-st-accent-color, st-lighten(#222226, 9%), 5%); }
 +  .overview-tile:highlighted, .grid-search-result:highlighted, .overview-tile:selected, .grid-search-result:selected, .overview-tile:checked, .grid-search-result:checked {
-       background-color: st-lighten(st-lighten(#282828, 8%), 7%); }
++    color: #fafafb;
++    background-color: st-lighten(#222226, 8%); }
 +    .overview-tile:highlighted:hover, .grid-search-result:highlighted:hover, .overview-tile:selected:hover, .grid-search-result:selected:hover, .overview-tile:checked:hover, .grid-search-result:checked:hover {
-       background-color: st-lighten(st-lighten(#282828, 8%), 9%); }
++      background-color: st-lighten(st-lighten(#222226, 8%), 7%); }
 +    .overview-tile:highlighted:active, .grid-search-result:highlighted:active, .overview-tile:selected:active, .grid-search-result:selected:active, .overview-tile:checked:active, .grid-search-result:checked:active {
-     color: st-transparentize(whitesmoke, 0.6);
-     background-color: #282828; }
++      background-color: st-lighten(st-lighten(#222226, 8%), 9%); }
 +  .overview-tile:insensitive, .grid-search-result:insensitive {
-   color: whitesmoke;
-   background-color: st-mix(whitesmoke, #282828, 12%); }
++    color: st-transparentize(#fafafb, 0.6);
++    background-color: #222226; }
 +  .overview-tile:drop, .grid-search-result:drop {
 +    background-color: st-transparentize(-st-accent-color, 0.8);
 +    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
 +  .overview-tile .overview-icon.overview-icon-with-label > StBoxLayout, .grid-search-result .overview-icon.overview-icon-with-label > StBoxLayout {
 +    spacing: 6px; }
 +
 +.app-folder {
-     color: whitesmoke;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, st-mix(whitesmoke, #282828, 12%), 5%); }
++  color: #fafafb;
++  background-color: st-mix(#fafafb, #222226, 12%); }
 +  .app-folder:focus {
-       background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 12%), 4%), 5%); }
++    color: #fafafb;
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    background-color: st-mix(-st-accent-color, st-mix(#fafafb, #222226, 12%), 5%); }
 +    .app-folder:focus:hover {
-     color: whitesmoke;
-     background-color: st-lighten(st-mix(whitesmoke, #282828, 12%), 4%); }
++      background-color: st-mix(-st-accent-color, st-lighten(st-mix(#fafafb, #222226, 12%), 4%), 5%); }
 +  .app-folder:hover {
-     color: whitesmoke;
-     background-color: st-lighten(st-mix(whitesmoke, #282828, 12%), 9%); }
++    color: #fafafb;
++    background-color: st-lighten(st-mix(#fafafb, #222226, 12%), 4%); }
 +  .app-folder:active {
-       background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 12%), 9%), 4%); }
++    color: #fafafb;
++    background-color: st-lighten(st-mix(#fafafb, #222226, 12%), 9%); }
 +    .app-folder:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 12%), 9%), 5%); }
++      background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 12%), 9%), 4%); }
 +    .app-folder:active:focus {
-     color: whitesmoke;
-     background-color: st-lighten(st-mix(whitesmoke, #282828, 12%), 8%); }
++      background-color: st-mix(-st-accent-color, st-lighten(st-mix(#fafafb, #222226, 12%), 9%), 5%); }
 +  .app-folder:highlighted, .app-folder:selected, .app-folder:checked {
-       background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 12%), 8%), 4%); }
++    color: #fafafb;
++    background-color: st-lighten(st-mix(#fafafb, #222226, 12%), 8%); }
 +    .app-folder:highlighted:hover, .app-folder:selected:hover, .app-folder:checked:hover {
-       background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 12%), 8%), 9%); }
++      background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 12%), 8%), 4%); }
 +    .app-folder:highlighted:active, .app-folder:selected:active, .app-folder:checked:active {
-     color: st-transparentize(whitesmoke, 0.6);
-     background-color: st-darken(st-mix(whitesmoke, #282828, 12%), 3%); }
++      background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 12%), 8%), 9%); }
 +  .app-folder:insensitive {
-   background-color: whitesmoke;
++    color: st-transparentize(#fafafb, 0.6);
++    background-color: st-darken(st-mix(#fafafb, #222226, 12%), 3%); }
 +  .app-folder:drop {
 +    background-color: st-transparentize(-st-accent-color, 0.8);
 +    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
 +
 +.app-grid-running-dot {
 +  height: 5px;
 +  width: 5px;
 +  border-radius: 5px;
-   background-color: #3d3d3d;
-   color: whitesmoke;
++  background-color: #fafafb;
 +  offset-y: 6px; }
 +
 +.app-folder-dialog-container {
 +  padding-top: 2.2em; }
 +
 +.app-folder-dialog {
 +  width: 720px;
 +  height: 720px;
 +  border-radius: 64px;
-   box-shadow: inset 0 0 0 1px rgba(245, 245, 245, 0.1); }
++  background-color: #38383b;
++  color: #fafafb;
 +  padding: 0 1px;
-     color: whitesmoke;
-     background-color: st-mix(whitesmoke, #3d3d3d, 12%); }
++  box-shadow: inset 0 0 0 1px rgba(250, 250, 251, 0.1); }
 +  .app-folder-dialog .folder-name-container {
 +    padding: 24px 36px;
 +    padding-bottom: 0; }
 +    .app-folder-dialog .folder-name-container .folder-name-entry {
 +      width: 12em; }
 +  .app-folder-dialog .icon-button, .app-folder-dialog .login-dialog-button.cancel-button, .app-folder-dialog .login-dialog-button.switch-user-button, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button, .app-folder-dialog .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .app-folder-dialog .pager-button, .app-folder-dialog .message .message-header .message-expand-button, .message .message-header .app-folder-dialog .message-expand-button,
 +  .app-folder-dialog .message .message-header .message-close-button,
 +  .message .message-header .app-folder-dialog .message-close-button, .app-folder-dialog .screenshot-ui-show-pointer-button {
-       color: whitesmoke;
-       background-color: st-lighten(st-mix(whitesmoke, #3d3d3d, 12%), 4%); }
++    color: #fafafb;
++    background-color: st-mix(#fafafb, #38383b, 12%); }
 +    .app-folder-dialog .icon-button:hover, .app-folder-dialog .login-dialog-button.cancel-button:hover, .app-folder-dialog .login-dialog-button.switch-user-button:hover, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:hover, .app-folder-dialog .calendar .calendar-month-header .pager-button:hover, .calendar .calendar-month-header .app-folder-dialog .pager-button:hover, .app-folder-dialog .message .message-header .message-expand-button:hover, .message .message-header .app-folder-dialog .message-expand-button:hover,
 +    .app-folder-dialog .message .message-header .message-close-button:hover,
 +    .message .message-header .app-folder-dialog .message-close-button:hover, .app-folder-dialog .screenshot-ui-show-pointer-button:hover {
-       color: whitesmoke;
-       background-color: st-lighten(st-mix(whitesmoke, #3d3d3d, 12%), 9%); }
++      color: #fafafb;
++      background-color: st-lighten(st-mix(#fafafb, #38383b, 12%), 4%); }
 +    .app-folder-dialog .icon-button:active, .app-folder-dialog .login-dialog-button.cancel-button:active, .app-folder-dialog .login-dialog-button.switch-user-button:active, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active, .app-folder-dialog .calendar .calendar-month-header .pager-button:active, .calendar .calendar-month-header .app-folder-dialog .pager-button:active, .app-folder-dialog .message .message-header .message-expand-button:active, .message .message-header .app-folder-dialog .message-expand-button:active,
 +    .app-folder-dialog .message .message-header .message-close-button:active,
 +    .message .message-header .app-folder-dialog .message-close-button:active, .app-folder-dialog .screenshot-ui-show-pointer-button:active {
-         background-color: st-lighten(st-lighten(st-mix(whitesmoke, #3d3d3d, 12%), 9%), 4%); }
++      color: #fafafb;
++      background-color: st-lighten(st-mix(#fafafb, #38383b, 12%), 9%); }
 +      .app-folder-dialog .icon-button:active:hover, .app-folder-dialog .login-dialog-button.cancel-button:active:hover, .app-folder-dialog .login-dialog-button.switch-user-button:active:hover, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active:hover, .app-folder-dialog .calendar .calendar-month-header .pager-button:active:hover, .calendar .calendar-month-header .app-folder-dialog .pager-button:active:hover, .app-folder-dialog .message .message-header .message-expand-button:active:hover, .message .message-header .app-folder-dialog .message-expand-button:active:hover,
 +      .app-folder-dialog .message .message-header .message-close-button:active:hover,
 +      .message .message-header .app-folder-dialog .message-close-button:active:hover, .app-folder-dialog .screenshot-ui-show-pointer-button:active:hover {
-         background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #3d3d3d, 12%), 9%), 5%); }
++        background-color: st-lighten(st-lighten(st-mix(#fafafb, #38383b, 12%), 9%), 4%); }
 +      .app-folder-dialog .icon-button:active:focus, .app-folder-dialog .login-dialog-button.cancel-button:active:focus, .app-folder-dialog .login-dialog-button.switch-user-button:active:focus, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active:focus, .app-folder-dialog .calendar .calendar-month-header .pager-button:active:focus, .calendar .calendar-month-header .app-folder-dialog .pager-button:active:focus, .app-folder-dialog .message .message-header .message-expand-button:active:focus, .message .message-header .app-folder-dialog .message-expand-button:active:focus,
 +      .app-folder-dialog .message .message-header .message-close-button:active:focus,
 +      .message .message-header .app-folder-dialog .message-close-button:active:focus, .app-folder-dialog .screenshot-ui-show-pointer-button:active:focus {
-     color: whitesmoke;
-     background-color: #3d3d3d; }
++        background-color: st-mix(-st-accent-color, st-lighten(st-mix(#fafafb, #38383b, 12%), 9%), 5%); }
 +  .app-folder-dialog .page-indicators {
 +    margin-bottom: 24px; }
 +  .app-folder-dialog .page-navigation-arrow {
-       color: whitesmoke;
-       background-color: st-lighten(#3d3d3d, 7%); }
++    color: #fafafb;
++    background-color: #38383b; }
 +    .app-folder-dialog .page-navigation-arrow:hover {
-       color: whitesmoke;
-       background-color: st-lighten(#3d3d3d, 9%); }
++      color: #fafafb;
++      background-color: st-lighten(#38383b, 7%); }
 +    .app-folder-dialog .page-navigation-arrow:active {
-         background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); }
++      color: #fafafb;
++      background-color: st-lighten(#38383b, 9%); }
 +      .app-folder-dialog .page-navigation-arrow:active:hover {
-         background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); }
++        background-color: st-lighten(st-lighten(#38383b, 9%), 7%); }
 +      .app-folder-dialog .page-navigation-arrow:active:focus {
-     color: whitesmoke;
-     background-color: #3d3d3d; }
++        background-color: st-mix(-st-accent-color, st-lighten(#38383b, 9%), 5%); }
 +  .app-folder-dialog .overview-tile, .app-folder-dialog .grid-search-result {
-       color: whitesmoke;
-       box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-       background-color: st-mix(-st-accent-color, rgba(61, 61, 61, 0.25), 5%); }
++    color: #fafafb;
++    background-color: #38383b;
++    background-color: transparent; }
 +    .app-folder-dialog .overview-tile:focus, .app-folder-dialog .grid-search-result:focus {
-         background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 7%), 5%); }
++      color: #fafafb;
++      box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++      background-color: st-mix(-st-accent-color, rgba(56, 56, 59, 0.25), 5%); }
 +      .app-folder-dialog .overview-tile:focus:hover, .app-folder-dialog .grid-search-result:focus:hover {
-       color: whitesmoke;
-       background-color: st-lighten(#3d3d3d, 7%); }
++        background-color: st-mix(-st-accent-color, st-lighten(#38383b, 7%), 5%); }
 +    .app-folder-dialog .overview-tile:hover, .app-folder-dialog .grid-search-result:hover {
-       color: whitesmoke;
-       background-color: st-lighten(#3d3d3d, 9%); }
++      color: #fafafb;
++      background-color: st-lighten(#38383b, 7%); }
 +    .app-folder-dialog .overview-tile:active, .app-folder-dialog .grid-search-result:active {
-         background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); }
++      color: #fafafb;
++      background-color: st-lighten(#38383b, 9%); }
 +      .app-folder-dialog .overview-tile:active:hover, .app-folder-dialog .grid-search-result:active:hover {
-         background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); }
++        background-color: st-lighten(st-lighten(#38383b, 9%), 7%); }
 +      .app-folder-dialog .overview-tile:active:focus, .app-folder-dialog .grid-search-result:active:focus {
-       color: whitesmoke;
-       background-color: st-lighten(#3d3d3d, 8%); }
++        background-color: st-mix(-st-accent-color, st-lighten(#38383b, 9%), 5%); }
 +    .app-folder-dialog .overview-tile:highlighted, .app-folder-dialog .grid-search-result:highlighted, .app-folder-dialog .overview-tile:selected, .app-folder-dialog .grid-search-result:selected, .app-folder-dialog .overview-tile:checked, .app-folder-dialog .grid-search-result:checked {
-         background-color: st-lighten(st-lighten(#3d3d3d, 8%), 7%); }
++      color: #fafafb;
++      background-color: st-lighten(#38383b, 8%); }
 +      .app-folder-dialog .overview-tile:highlighted:hover, .app-folder-dialog .grid-search-result:highlighted:hover, .app-folder-dialog .overview-tile:selected:hover, .app-folder-dialog .grid-search-result:selected:hover, .app-folder-dialog .overview-tile:checked:hover, .app-folder-dialog .grid-search-result:checked:hover {
-         background-color: st-lighten(st-lighten(#3d3d3d, 8%), 9%); }
++        background-color: st-lighten(st-lighten(#38383b, 8%), 7%); }
 +      .app-folder-dialog .overview-tile:highlighted:active, .app-folder-dialog .grid-search-result:highlighted:active, .app-folder-dialog .overview-tile:selected:active, .app-folder-dialog .grid-search-result:selected:active, .app-folder-dialog .overview-tile:checked:active, .app-folder-dialog .grid-search-result:checked:active {
-       color: st-transparentize(whitesmoke, 0.6);
-       background-color: #3d3d3d; }
++        background-color: st-lighten(st-lighten(#38383b, 8%), 9%); }
 +    .app-folder-dialog .overview-tile:insensitive, .app-folder-dialog .grid-search-result:insensitive {
-     background-color: whitesmoke;
++      color: st-transparentize(#fafafb, 0.6);
++      background-color: #38383b; }
 +    .app-folder-dialog .overview-tile:drop, .app-folder-dialog .grid-search-result:drop {
 +      background-color: st-transparentize(-st-accent-color, 0.8);
 +      box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
 +
 +.rename-folder-popup .rename-folder-popup-item {
 +  spacing: 6px; }
 +  .rename-folder-popup .rename-folder-popup-item:ltr, .rename-folder-popup .rename-folder-popup-item:rtl {
 +    padding: 0 12px; }
 +
 +.page-indicator {
 +  padding: 6px 12px 0;
 +  transition-duration: 400ms; }
 +  .page-indicator .page-indicator-icon {
 +    width: 10px;
 +    height: 10px;
 +    border-radius: 999px;
-   background-color: rgba(245, 245, 245, 0.1);
-   color: whitesmoke;
++    background-color: #fafafb;
 +    transition-duration: 400ms; }
 +
 +.apps-scroll-view {
 +  padding: 0; }
 +
 +.system-action-icon {
-   color: whitesmoke;
-   background-color: #282828; }
++  background-color: rgba(250, 250, 251, 0.1);
++  color: #fafafb;
 +  border-radius: 999px;
 +  icon-size: 48px; }
 +
 +.page-navigation-hint.dnd {
 +  background: rgba(255, 255, 255, 0.1); }
 +
 +.page-navigation-hint.next:ltr, .page-navigation-hint.previous:rtl {
 +  background-gradient-start: rgba(255, 255, 255, 0.05);
 +  background-gradient-end: transparent;
 +  background-gradient-direction: horizontal;
 +  border-radius: 24px 0px 0px 24px; }
 +
 +.page-navigation-hint.previous:ltr, .page-navigation-hint.next:rtl {
 +  background-gradient-start: transparent;
 +  background-gradient-end: rgba(255, 255, 255, 0.05);
 +  background-gradient-direction: horizontal;
 +  border-radius: 0px 24px 24px 0px; }
 +
 +.page-navigation-arrow {
 +  margin: 6px;
 +  padding: 18px;
 +  width: 24px;
 +  height: 24px;
 +  border-radius: 999px;
 +  transition-duration: 100ms;
-     color: whitesmoke; }
++  color: #fafafb;
++  background-color: #222226; }
 +  .page-navigation-arrow > StIcon {
-     color: whitesmoke;
-     background-color: st-lighten(#282828, 7%); }
++    color: #fafafb; }
 +  .page-navigation-arrow:hover {
-     color: whitesmoke;
-     background-color: st-lighten(#282828, 9%); }
++    color: #fafafb;
++    background-color: st-lighten(#222226, 7%); }
 +  .page-navigation-arrow:active {
-       background-color: st-lighten(st-lighten(#282828, 9%), 7%); }
++    color: #fafafb;
++    background-color: st-lighten(#222226, 9%); }
 +    .page-navigation-arrow:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(#282828, 9%), 5%); }
++      background-color: st-lighten(st-lighten(#222226, 9%), 7%); }
 +    .page-navigation-arrow:active:focus {
-     color: whitesmoke;
-     background-color: #4e4e4e;
++      background-color: st-mix(-st-accent-color, st-lighten(#222226, 9%), 5%); }
 +
 +/* Workspace pager */
 +.workspace-thumbnails {
 +  visible-width: 32px;
 +  spacing: 6px;
 +  padding: 6px; }
 +  .workspace-thumbnails .workspace-thumbnail {
-   background-color: rgba(255, 255, 255, 0.05);
-   color: #ffffff; }
++    color: #fafafb;
++    background-color: #46464e;
 +    border-radius: 4px;
 +    border: 1px solid transparent; }
 +  .workspace-thumbnails .placeholder {
 +    background-image: url("resource:///org/gnome/shell/theme/workspace-placeholder.svg");
 +    background-size: contain;
 +    width: 18px; }
 +
 +.workspace-thumbnail-indicator {
 +  border: 3px solid -st-accent-color;
 +  border-radius: 8px; }
 +
 +.ripple-pointer-location {
 +  width: 50px;
 +  height: 50px;
 +  border-radius: 25px;
 +  background-color: st-lighten(st-transparentize(-st-accent-color, 0.7), 30%);
 +  box-shadow: 0 0 2px 2px st-lighten(-st-accent-color, 20%); }
 +
 +.pie-timer {
 +  width: 60px;
 +  height: 60px;
 +  -pie-border-width: 3px;
 +  -pie-border-color: -st-accent-color;
 +  -pie-background-color: st-lighten(st-transparentize(-st-accent-color, 0.7), 40%); }
 +
 +.magnifier-zoom-region {
 +  border: 2px solid -st-accent-color; }
 +  .magnifier-zoom-region.full-screen {
 +    border-width: 0; }
 +
 +.select-area-rubberband {
 +  background-color: st-transparentize(-st-accent-color, 0.7);
 +  border: 1px solid -st-accent-color; }
 +
 +.user-icon {
 +  background-size: contain;
 +  border-radius: 999px;
 +  icon-size: 64px;
-     box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1); }
++  background-color: rgba(34, 34, 38, 0.05);
++  color: #222226; }
 +  .user-icon StIcon {
 +    padding: 12px; }
 +  .user-icon.user-avatar {
-   color: #f5c211; }
++    box-shadow: inset 0 0 0 1px rgba(34, 34, 38, 0.1); }
 +
 +.lightbox {
 +  background-color: black; }
 +
 +.flashspot {
 +  background-color: white; }
 +
 +.hidden {
 +  color: transparent; }
 +
 +.caps-lock-warning-label {
 +  text-align: center;
 +  padding-bottom: 8px;
-   background-color: #353535; }
++  color: #e5a50a; }
 +
 +/* Workspace animation */
 +.workspace-animation {
-   background-color: #353535;
++  background-color: #2e2e33; }
 +
 +/* Tiled window previews */
 +.tile-preview {
 +  background-color: st-transparentize(-st-accent-color, 0.5);
 +  border: 1px solid -st-accent-color; }
 +
 +/* On-screen Keyboard */
 +#keyboard {
-   min-height: 1.2em;
-   min-width: 1.2em;
-   border-width: 1px;
-   border-style: solid;
-   border-radius: 10px;
++  background-color: #2e2e33;
 +  box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.02); }
 +  #keyboard .page-indicator {
 +    padding: 6px; }
 +    #keyboard .page-indicator .page-indicator-icon {
 +      width: 8px;
 +      height: 8px; }
 +
 +.key-container {
 +  padding: 4px;
 +  spacing: 4px; }
 +
 +.keyboard-key {
 +  font-size: 1.455em;
 +  font-weight: bold;
-     color: #282828;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, st-mix(#282828, whitesmoke, 12%), 5%); }
++  border-radius: 0.546em;
 +  box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.05);
 +  color: #ffffff;
 +  background-color: st-mix(#ffffff, #4d4d4d, 12%); }
 +  .keyboard-key:focus {
-       background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, whitesmoke, 12%), 4%), 5%); }
++    color: #222226;
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    background-color: st-mix(-st-accent-color, st-mix(#222226, #fafafb, 12%), 5%); }
 +    .keyboard-key:focus:hover {
-   .keyboard-key:grayed {
-     background-color: #ededed;
-     color: #ffffff;
-     border-color: rgba(255, 255, 255, 0.1); }
++      background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #fafafb, 12%), 4%), 5%); }
 +  .keyboard-key:hover {
 +    color: #ffffff;
 +    background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 4%); }
 +  .keyboard-key:active {
 +    color: #ffffff;
 +    background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%); }
 +    .keyboard-key:active:hover {
 +      background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%), 4%); }
 +    .keyboard-key:active:focus {
 +      background-color: st-mix(-st-accent-color, st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%), 5%); }
 +  .keyboard-key:checked {
 +    color: #ffffff;
 +    background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%); }
 +    .keyboard-key:checked:hover {
 +      background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%), 4%); }
 +    .keyboard-key:checked:active {
 +      background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%), 9%); }
-     border-radius: 10px; }
 +  .keyboard-key.default-key {
 +    color: #ffffff;
 +    background-color: st-mix(#ffffff, #303030, 12%);
-       border-color: st-lighten(-st-accent-color, 5%);
++    border: none; }
 +    .keyboard-key.default-key:hover {
 +      color: #ffffff;
 +      background-color: st-darken(st-mix(#ffffff, #303030, 12%), 4%); }
 +    .keyboard-key.default-key:active {
 +      color: #ffffff;
 +      background-color: st-darken(st-mix(#ffffff, #303030, 12%), 9%); }
 +      .keyboard-key.default-key:active:hover {
 +        background-color: st-darken(st-darken(st-mix(#ffffff, #303030, 12%), 9%), 4%); }
 +      .keyboard-key.default-key:active:focus {
 +        background-color: st-mix(-st-accent-color, st-darken(st-mix(#ffffff, #303030, 12%), 9%), 5%); }
 +    .keyboard-key.default-key:checked {
 +      color: #ffffff;
 +      background-color: st-darken(st-mix(#ffffff, #303030, 12%), 8%); }
 +      .keyboard-key.default-key:checked:hover {
 +        background-color: st-darken(st-darken(st-mix(#ffffff, #303030, 12%), 8%), 4%); }
 +      .keyboard-key.default-key:checked:active {
 +        background-color: st-darken(st-darken(st-mix(#ffffff, #303030, 12%), 8%), 9%); }
 +    .keyboard-key.default-key:latched {
-   .keyboard-key.enter-key {
-     color: -st-accent-fg-color;
-     background-color: st-mix(-st-accent-fg-color, -st-accent-color, 12%);
-     border-radius: 10px;
-     color: #ffffff; }
-     .keyboard-key.enter-key:hover {
-       color: -st-accent-fg-color;
-       background-color: st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 4%); }
-     .keyboard-key.enter-key:active {
-       color: -st-accent-fg-color;
-       background-color: st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 9%); }
-       .keyboard-key.enter-key:active:hover {
-         background-color: st-darken(st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 9%), 4%); }
-       .keyboard-key.enter-key:active:focus {
-         background-color: st-mix(-st-accent-color, st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 9%), 5%); }
-     .keyboard-key.enter-key:checked {
-       color: -st-accent-fg-color;
-       background-color: st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 8%); }
-       .keyboard-key.enter-key:checked:hover {
-         background-color: st-darken(st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 8%), 4%); }
-       .keyboard-key.enter-key:checked:active {
-         background-color: st-darken(st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 8%), 9%); }
-   .keyboard-key.shift-key-uppercase {
-     background-color: gray;
-     color: #353535; }
-     .keyboard-key.shift-key-uppercase:hover {
-       background-color: #8c8c8c;
-       color: #424242; }
 +      background-color: -st-accent-color; }
-     icon-size: 24px; }
 +  .keyboard-key StIcon {
- .keyboard-subkeys {
-   -arrow-border-radius: 16px;
-   -arrow-background-color: #353535;
++    icon-size: 1.6365em; }
 +
-   -arrow-border-color: #4c4c4c;
++.keyboard-subkeys-boxpointer {
++  -arrow-border-radius: 22px;
++  -arrow-background-color: #2e2e33;
 +  -arrow-border-width: 1px;
-   -boxpointer-gap: 6px;
-   padding: 6px; }
-   .keyboard-subkeys .keyboard-key {
-     color: #ffffff;
-     background-color: st-mix(#ffffff, #4d4d4d, 12%);
-     border-radius: 10px; }
-     .keyboard-subkeys .keyboard-key:focus {
-       color: #282828;
-       box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-       background-color: st-mix(-st-accent-color, st-mix(#282828, whitesmoke, 12%), 5%); }
-       .keyboard-subkeys .keyboard-key:focus:hover {
-         background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, whitesmoke, 12%), 4%), 5%); }
-     .keyboard-subkeys .keyboard-key:hover {
-       color: #ffffff;
-       background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 4%); }
-     .keyboard-subkeys .keyboard-key:active {
-       color: #ffffff;
-       background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%); }
-       .keyboard-subkeys .keyboard-key:active:hover {
-         background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%), 4%); }
-       .keyboard-subkeys .keyboard-key:active:focus {
-         background-color: st-mix(-st-accent-color, st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%), 5%); }
-     .keyboard-subkeys .keyboard-key:checked {
-       color: #ffffff;
-       background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%); }
-       .keyboard-subkeys .keyboard-key:checked:hover {
-         background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%), 4%); }
-       .keyboard-subkeys .keyboard-key:checked:active {
-         background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%), 9%); }
++  -arrow-border-color: #44444c;
 +  -arrow-base: 20px;
 +  -arrow-rise: 10px;
-     padding: 0px 18px;
++  -boxpointer-gap: 4px;
++  border-radius: 22px;
++  box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.1); }
++  .keyboard-subkeys-boxpointer .key-container {
++    padding: 12px;
++    spacing: 8px; }
 +
 +.emoji-page .keyboard-key {
 +  background-color: transparent;
 +  border: none;
 +  color: initial; }
 +
 +.emoji-panel .keyboard-key:latched {
 +  border-color: st-lighten(-st-accent-color, 5%);
 +  background-color: -st-accent-color; }
 +
 +.word-suggestions {
 +  spacing: 12px;
 +  min-height: 17pt;
 +  padding: 12px;
 +  color: #ffffff; }
 +  .word-suggestions StButton {
 +    margin: 0 3px;
 +    min-width: 32px;
 +    border-radius: 4px;
-       color: #282828;
-       box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-       background-color: st-mix(-st-accent-color, st-mix(#282828, whitesmoke, 12%), 5%); }
++    padding: 6px 18px;
 +    background-color: transparent;
 +    border-color: transparent;
 +    box-shadow: none; }
 +    .word-suggestions StButton:insensitive {
 +      background-color: transparent !important; }
 +    .word-suggestions StButton:focus {
-         background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, whitesmoke, 12%), 4%), 5%); }
++      color: #222226;
++      box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++      background-color: st-mix(-st-accent-color, st-mix(#222226, #fafafb, 12%), 5%); }
 +      .word-suggestions StButton:focus:hover {
-   background-color: rgba(53, 53, 53, 0.98);
++        background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #fafafb, 12%), 4%), 5%); }
 +    .word-suggestions StButton:hover {
 +      color: #ffffff;
 +      background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 4%); }
 +    .word-suggestions StButton:active {
 +      color: #ffffff;
 +      background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%); }
 +      .word-suggestions StButton:active:hover {
 +        background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%), 4%); }
 +      .word-suggestions StButton:active:focus {
 +        background-color: st-mix(-st-accent-color, st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%), 5%); }
 +    .word-suggestions StButton:checked {
 +      color: #ffffff;
 +      background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%); }
 +      .word-suggestions StButton:checked:hover {
 +        background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%), 4%); }
 +      .word-suggestions StButton:checked:active {
 +        background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%), 9%); }
 +
 +/* Looking Glass */
 +.lg-dialog StEntry {
 +  min-height: 1.5em; }
 +
 +.lg-dialog .shell-link {
 +  color: st-lighten(-st-accent-color, 20%); }
 +  .lg-dialog .shell-link:hover {
 +    color: st-lighten(st-lighten(-st-accent-color, 20%), 10%); }
 +  .lg-dialog .shell-link:active {
 +    color: st-darken(st-lighten(-st-accent-color, 20%), 10%); }
 +
 +.lg-dialog .actor-link {
 +  color: st-darken(#ffffff, 20%); }
 +  .lg-dialog .actor-link:hover {
 +    color: #ffffff; }
 +  .lg-dialog .actor-link:active {
 +    color: st-lighten(#ffffff, 20%); }
 +  .lg-dialog .actor-link StIcon {
 +    icon-size: 12px; }
 +
 +.lg-completions-text {
 +  font-style: italic; }
 +
 +#LookingGlassDialog {
-       background-color: st-lighten(st-mix(#ffffff, #353535, 12%), 9%); }
++  background-color: rgba(46, 46, 51, 0.98);
 +  color: #ffffff;
 +  border-radius: 16px;
 +  margin-top: 4px;
 +  border: 2px solid transparent;
 +  padding: 6px;
 +  spacing: 6px;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05); }
 +  #LookingGlassDialog > #Toolbar {
 +    border: none;
 +    padding: 6px;
 +    border-radius: 0;
 +    background-color: transparent;
 +    spacing: 6px; }
 +    #LookingGlassDialog > #Toolbar .lg-toolbar-button {
 +      padding: 6px 12px; }
 +      #LookingGlassDialog > #Toolbar .lg-toolbar-button > StIcon {
 +        icon-size: 16px; }
 +  #LookingGlassDialog .labels {
 +    spacing: 6px; }
 +  #LookingGlassDialog .notebook-tab {
 +    background-color: transparent;
 +    -natural-hpadding: 12px;
 +    -minimum-hpadding: 12px;
 +    padding: 6px 12px; }
 +    #LookingGlassDialog .notebook-tab:selected {
 +      color: #ffffff;
-         background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 12%), 9%), 4%); }
++      background-color: st-lighten(st-mix(#ffffff, #2e2e33, 12%), 9%); }
 +      #LookingGlassDialog .notebook-tab:selected:hover {
-         background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 12%), 9%), 5%); }
++        background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 12%), 9%), 4%); }
 +      #LookingGlassDialog .notebook-tab:selected:focus {
-   background-color: #353535;
++        background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #2e2e33, 12%), 9%), 5%); }
 +
 +#LookingGlassPropertyInspector {
-     background-color: st-mix(#ffffff, #353535, 12%);
++  background-color: #2e2e33;
 +  color: #ffffff;
 +  border-radius: 16px;
 +  border: 1px solid rgba(255, 255, 255, 0.1);
 +  padding: 12px; }
 +  #LookingGlassPropertyInspector .lg-obj-inspector-title {
 +    spacing: 4px; }
 +  #LookingGlassPropertyInspector .lg-obj-inspector-close-button,
 +  #LookingGlassPropertyInspector .lg-obj-inspector-button {
 +    padding: 6px 12px; }
 +  #LookingGlassPropertyInspector .lg-obj-inspector-close-button {
 +    margin: 4px;
 +    padding: 6px;
 +    border-radius: 999px; }
 +    #LookingGlassPropertyInspector .lg-obj-inspector-close-button > StIcon {
 +      icon-size: 16px; }
 +
 +#LookingGlassEvaluator {
 +  padding: 6px; }
 +  #LookingGlassEvaluator .evaluator-results {
 +    spacing: 6px; }
 +
 +#LookingGlassWindows {
 +  padding: 6px;
 +  spacing: 6px; }
 +  #LookingGlassWindows .lg-window {
 +    color: #ffffff;
-   background-color: st-mix(#ffffff, #353535, 12%);
++    background-color: st-mix(#ffffff, #2e2e33, 12%);
 +    margin: 0;
 +    padding: 12px; }
 +
 +#LookingGlassExtensions .lg-extensions-list {
 +  padding: 6px;
 +  spacing: 6px; }
 +
 +#LookingGlassExtensions .lg-extension {
 +  color: #ffffff;
-   color: whitesmoke; }
++  background-color: st-mix(#ffffff, #2e2e33, 12%);
 +  margin: 0;
 +  spacing: 4px;
 +  padding: 12px; }
 +  #LookingGlassExtensions .lg-extension .lg-extension-name {
 +    color: #ffffff !important; }
 +  #LookingGlassExtensions .lg-extension .lg-extension-meta {
 +    spacing: 12px; }
 +
 +#LookingGlassExtensions .lg-extensions-none {
 +  color: rgba(255, 255, 255, 0.5); }
 +
 +#LookingGlassActors {
 +  padding: 6px;
 +  spacing: 4px; }
 +
 +#LookingGlassDebugFlags .lg-debug-flags-header {
 +  padding: 6px;
 +  padding-top: 12px; }
 +
 +#LookingGlassDebugFlags .lg-debug-flag-button {
 +  padding: 9px 12px;
 +  margin-bottom: 6px; }
 +  #LookingGlassDebugFlags .lg-debug-flag-button StLabel {
 +    font-weight: normal !important; }
 +  #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch {
 +    background: rgba(255, 255, 255, 0.15); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:hover {
 +      background: rgba(255, 255, 255, 0.2); }
 +    #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:checked {
 +      background: -st-accent-color;
 +      color: -st-accent-fg-color; }
 +      #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:checked:hover {
 +        background-color: st-lighten(-st-accent-color, 5%);
 +        color: st-lighten(-st-accent-fg-color, 5%); }
 +
 +.login-dialog,
 +.unlock-dialog {
-     color: whitesmoke; }
++  color: #fafafb; }
 +  .login-dialog .caps-lock-warning-label,
 +  .login-dialog .login-dialog-message-warning,
 +  .unlock-dialog .caps-lock-warning-label,
 +  .unlock-dialog .login-dialog-message-warning {
-     color: #f5c211; }
++    color: #fafafb; }
 +  .login-dialog .login-dialog-prompt-layout,
 +  .unlock-dialog .login-dialog-prompt-layout {
 +    width: 25em;
 +    spacing: 9px; }
 +
 +.login-dialog-button.cancel-button {
 +  padding: 9px; }
 +
 +.login-dialog-button-box {
 +  spacing: 12px; }
 +
 +.conflicting-session-dialog-content {
 +  spacing: 20px; }
 +  .conflicting-session-dialog-content .conflicting-session-dialog-title {
 +    text-align: center;
 +    margin-bottom: 5px; }
 +  .conflicting-session-dialog-content .conflicting-session-dialog-desc {
 +    text-align: center; }
 +  .conflicting-session-dialog-content .conflicting-session-dialog-desc-warning {
 +    text-align: center;
-     color: gainsboro; }
++    color: #e5a50a; }
 +
 +.login-dialog-logo-bin {
 +  margin: 3em 0; }
 +
 +.login-dialog-banner-view {
 +  max-width: 25em; }
 +  .login-dialog-banner-view .login-dialog-banner {
-   color: gainsboro;
++    color: #dedee4; }
 +
 +.login-dialog-message {
 +  text-align: center; }
 +
 +.login-dialog-message-hint, .login-dialog-message {
-   color: whitesmoke;
-   background-color: #282828;
++  color: #dedee4;
 +  min-height: 2.75em; }
 +
 +.login-dialog-user-selection-box {
 +  padding-top: 4em;
 +  padding-bottom: 8em; }
 +
 +.login-dialog-not-listed-label {
 +  padding: 6px; }
 +
 +.login-dialog-not-listed-button {
-     color: whitesmoke;
-     box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-     background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.25), 5%); }
++  color: #fafafb;
++  background-color: #222226;
 +  padding: 0 6px;
 +  margin: 6px; }
 +  .login-dialog-not-listed-button:focus {
-       background-color: st-mix(-st-accent-color, st-lighten(#282828, 7%), 5%); }
++    color: #fafafb;
++    box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++    background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.25), 5%); }
 +    .login-dialog-not-listed-button:focus:hover {
-     color: whitesmoke;
-     background-color: st-lighten(#282828, 7%); }
++      background-color: st-mix(-st-accent-color, st-lighten(#222226, 7%), 5%); }
 +  .login-dialog-not-listed-button:hover {
-     color: whitesmoke;
-     background-color: st-lighten(#282828, 9%); }
++    color: #fafafb;
++    background-color: st-lighten(#222226, 7%); }
 +  .login-dialog-not-listed-button:active {
-       background-color: st-lighten(st-lighten(#282828, 9%), 7%); }
++    color: #fafafb;
++    background-color: st-lighten(#222226, 9%); }
 +    .login-dialog-not-listed-button:active:hover {
-       background-color: st-mix(-st-accent-color, st-lighten(#282828, 9%), 5%); }
++      background-color: st-lighten(st-lighten(#222226, 9%), 7%); }
 +    .login-dialog-not-listed-button:active:focus {
-   color: darkgray; }
++      background-color: st-mix(-st-accent-color, st-lighten(#222226, 9%), 5%); }
 +
 +.login-dialog-auth-list-view {
 +  -st-vfade-offset: 3em; }
 +
 +.login-dialog-auth-list {
 +  spacing: 6px;
 +  margin-left: 2em; }
 +
 +.login-dialog-auth-list-title {
 +  margin-left: 2em; }
 +
 +.login-dialog-auth-list-item {
 +  border-radius: 16px;
 +  padding: 4px;
-       color: whitesmoke;
-       background-color: st-mix(whitesmoke, #282828, 12%);
++  color: #a5a5b7; }
 +  .login-dialog-auth-list-item:focus, .login-dialog-auth-list-item:selected {
 +    background-color: -st-accent-color;
 +    color: -st-accent-fg-color; }
 +
 +.login-dialog-auth-list-label:ltr {
 +  padding-left: 15px;
 +  text-align: left; }
 +
 +.login-dialog-auth-list-label:rtl {
 +  padding-right: 15px;
 +  text-align: right; }
 +
 +.login-dialog-user-list-view {
 +  width: 25em;
 +  -st-vfade-offset: 3em; }
 +  .login-dialog-user-list-view .login-dialog-user-list {
 +    margin: 0 8px;
 +    spacing: 12px; }
 +    .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item {
-         color: whitesmoke;
-         box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
-         background-color: st-mix(-st-accent-color, st-mix(whitesmoke, #282828, 12%), 5%); }
++      color: #fafafb;
++      background-color: st-mix(#fafafb, #222226, 12%);
 +      border-radius: 16px;
 +      padding: 9px; }
 +      .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:selected, .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:focus {
-           background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 12%), 4%), 5%); }
++        color: #fafafb;
++        box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++        background-color: st-mix(-st-accent-color, st-mix(#fafafb, #222226, 12%), 5%); }
 +        .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:selected:hover, .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:focus:hover {
-         color: whitesmoke;
-         background-color: st-lighten(st-mix(whitesmoke, #282828, 12%), 4%); }
++          background-color: st-mix(-st-accent-color, st-lighten(st-mix(#fafafb, #222226, 12%), 4%), 5%); }
 +      .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:hover {
-         color: whitesmoke;
-         background-color: st-lighten(st-mix(whitesmoke, #282828, 12%), 9%); }
++        color: #fafafb;
++        background-color: st-lighten(st-mix(#fafafb, #222226, 12%), 4%); }
 +      .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active {
-           background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 12%), 9%), 4%); }
++        color: #fafafb;
++        background-color: st-lighten(st-mix(#fafafb, #222226, 12%), 9%); }
 +        .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active:hover {
-           background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 12%), 9%), 5%); }
++          background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 12%), 9%), 4%); }
 +        .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active:focus {
-         background-color: rgba(245, 245, 245, 0.7); }
++          background-color: st-mix(-st-accent-color, st-lighten(st-mix(#fafafb, #222226, 12%), 9%), 5%); }
 +      .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item .user-icon {
 +        border: 2px solid transparent; }
 +      .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item .login-dialog-timed-login-indicator {
 +        height: 2px;
 +        margin-top: 6px;
-   background-color: #282828; }
++        background-color: rgba(250, 250, 251, 0.7); }
 +      .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:logged-in .user-icon {
 +        border-color: -st-accent-color; }
 +        .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:logged-in .user-icon StIcon {
 +          background-color: st-transparentize(-st-accent-color, 0.7); }
 +
 +.unlock-dialog {
 +  background-color: transparent; }
 +
 +.screen-shield-background {
 +  background: black;
 +  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.6); }
 +
 +#lockDialogGroup {
-   color: whitesmoke;
++  background-color: #222226; }
 +
 +.unlock-dialog-clock {
-   background-color: rgba(245, 245, 245, 0.3); }
++  color: #fafafb;
 +  spacing: 2em; }
 +  .unlock-dialog-clock .unlock-dialog-clock-time {
 +    font-size: 6.546em;
 +    font-weight: 800; }
 +  .unlock-dialog-clock .unlock-dialog-clock-date {
 +    font-weight: 400; }
 +  .unlock-dialog-clock .unlock-dialog-clock-hint {
 +    margin-top: 2em;
 +    padding: 6px 18px;
 +    border-radius: 16px;
 +    font-weight: bold; }
 +
 +#unlockDialogNotifications StButton#vhandle, #unlockDialogNotifications StButton#hhandle {
-     background-color: rgba(245, 245, 245, 0.5); }
++  background-color: rgba(250, 250, 251, 0.3); }
 +  #unlockDialogNotifications StButton#vhandle:hover, #unlockDialogNotifications StButton#vhandle:focus, #unlockDialogNotifications StButton#hhandle:hover, #unlockDialogNotifications StButton#hhandle:focus {
-     background-color: rgba(245, 245, 245, 0.1);
-     color: whitesmoke;
++    background-color: rgba(250, 250, 251, 0.5); }
 +  #unlockDialogNotifications StButton#vhandle:active, #unlockDialogNotifications StButton#hhandle:active {
 +    background-color: st-transparentize(-st-accent-color, 0.5); }
 +
 +.unlock-dialog-notifications-container {
 +  margin: 12px;
 +  spacing: 6px;
 +  width: 25em;
 +  background-color: transparent; }
 +  .unlock-dialog-notifications-container .summary-notification-stack-scrollview {
 +    padding-top: 0;
 +    padding-bottom: 0; }
 +  .unlock-dialog-notifications-container .notification,
 +  .unlock-dialog-notifications-container .unlock-dialog-notification-source {
 +    padding: 12px 16px;
 +    border: none;
-       background-color: rgba(245, 245, 245, 0.2); }
++    background-color: rgba(250, 250, 251, 0.1);
++    color: #fafafb;
 +    border-radius: 16px; }
 +    .unlock-dialog-notifications-container .notification.critical,
 +    .unlock-dialog-notifications-container .unlock-dialog-notification-source.critical {
-   color: whitesmoke;
-   background-color: rgba(245, 245, 245, 0.1);
++      background-color: rgba(250, 250, 251, 0.2); }
 +
 +.unlock-dialog-notification-icon {
 +  icon-size: 32px; }
 +
 +.unlock-dialog-notification-label {
 +  padding-left: 12px;
 +  padding-right: 0; }
 +  .unlock-dialog-notification-label:rtl {
 +    padding-right: 12px;
 +    padding-left: 0; }
 +
 +.unlock-dialog-notification-count-text {
 +  font-weight: bold;
 +  padding: 0 12px;
-   color: whitesmoke; }
++  color: #fafafb;
++  background-color: rgba(250, 250, 251, 0.1);
 +  border-radius: 999px; }
 +
 +.login-dialog .user-widget .user-widget-label,
 +.unlock-dialog .user-widget .user-widget-label {
-   background-color: rgba(245, 245, 245, 0.13);
-   color: whitesmoke; }
++  color: #fafafb; }
 +
 +.login-dialog .user-widget .user-icon,
 +.unlock-dialog .user-widget .user-icon {
++  background-color: rgba(250, 250, 251, 0.13);
++  color: #fafafb; }
 +
 +.login-dialog .user-widget.horizontal,
 +.unlock-dialog .user-widget.horizontal {
 +  spacing: 18px; }
 +
 +.login-dialog .user-widget.vertical,
 +.unlock-dialog .user-widget.vertical {
 +  spacing: 24px; }
 +  .login-dialog .user-widget.vertical .user-widget-label,
 +  .unlock-dialog .user-widget.vertical .user-widget-label {
 +    font-weight: 400;
 +    font-size: 1.818em;
 +    text-align: center;
 +    margin-bottom: .75em; }
 +  .login-dialog .user-widget.vertical .user-icon,
 +  .unlock-dialog .user-widget.vertical .user-icon {
 +    icon-size: 160px; }
 +    .login-dialog .user-widget.vertical .user-icon StIcon,
 +    .unlock-dialog .user-widget.vertical .user-icon StIcon {
 +      padding: 30px; }
index ee475af865b8c96bae961f0f25b863b6ea6877fb,0000000000000000000000000000000000000000..9a3ed298f22ded86f20c8d3da5cadb82a70bb4ae
mode 100644,000000..100644
--- /dev/null
@@@ -1,82 -1,0 +1,110 @@@
 +# Release Notes
 +
++## 3.10.1 - July 14, 2024
++
++- The internal copy of the Jasmine library has been updaetd to version 3.10.1, which brings:
++  - Support for async before/it/after functions (2.7.0)
++  - Add `nothing()` matcher (2.8.0)
++  - Add `jasmine.arrayWithExactContents()` tester (2.8.0)
++  - Support for `jasmine.any(Symbol)` (2.9.0)
++  - `jasmine.any(Object)` no longer matches null (3.0)
++  - Add `jasmine.truthy()`, `jasmine.falsy()`, `jasmine.empty()`, and `jasmine.notEmpty()` testers (3.1.0)
++  - Add `spyOnAllFunctions()` (3.2.0)
++  - Add `expectAsync()`, and `toBeResolved()` and `toBeRejected()` matchers (3.2.0)
++  - Add `withContext()` for extra debugging information (3.3.0)
++  - Add `toBeRejectedWith()` matcher (3.3.0)
++  - Support for custom async matchers with `jasmine.addAsyncMatchers()` (3.5.0)
++  - Add `jasmine.setDefaultSpyStrategy()` (3.5.0)
++  - Add `jasmine.mapContaining()` and `jasmine.setContaining()` tester (3.5.0)
++  - Add `toBeTrue()` and `toBeFalse()` matchers (3.5.0)
++  - Add `toHaveBeenCalledOnceWith()` matcher (3.6.0)
++  - Add `toHaveSize()` matcher (3.6.0)
++  - Add `toBePending()` matcher (3.6.0)
++  - Add `already` property of async specs (3.8.0)
++  - Add `spy.calls.thisFor()` (3.8.0)
++  - Add `jasmine.stringContaining()` tester (3.10.0)
++  - All other bug fixes and improvements contained in the intervening versions; see Jasmine's release notes
++- It is now possible to use Jasmine GJS as a Meson subproject.
++- Jasmine GJS now depends on GJS 1.68.0.
++- Thanks to Florian Müllner and Martín Abente Lahaye for contributing.
++
 +## 2.6.4 - September 13, 2020
 +
 +- The internal copy of the Jasmine library has been updated to version 2.6.4, which brings:
 +  - Add `toBeNegativeInfinity()`, `toBePositiveInfinity()`, `toHaveBeenCalledBefore()` matchers
 +  - Add `spyOnProperty()` for get/set accessors
 +  - Add support for ES6 sets to `toContain()` and `toEqual()`
 +  - Bug fixes included in 2.6.0, 2.6.1, 2.6.2, 2.6.3 and 2.6.4
 +- Thanks to Andy Holmes for contributing.
 +
 +## 2.5.2 - September 10, 2020
 +
 +- The internal copy of the Jasmine library has been updated to version 2.5.2, which brings:
 +  - Add `toBeGreaterThanOrEqual()` and `toBeLessThanOrEqual()` matchers
 +  - Bug fixes included in 2.5.0, 2.5.1 and 2.5.2
 +- Thanks to Andy Holmes for contributing.
 +
 +## 2.4.1 - Sepetember 4, 2020
 +
 +- The internal copy of the Jasmine library has been updated to version 2.4.1, which brings:
 +  - Run jasmine's specs in random order
 +  - Add support for returning run details for reporting randomness
 +  - Bug fixes included in 2.4.0
 +- Thanks to Andy Holmes for contributing.
 +
 +## 2.3.4 - August 30, 2020
 +
 +- Fixed a regression in 2.3.0 which caused include paths in the config file to be treated as additional spec paths.
 +- The TAP reporter now outputs the test plan at the beginning instead of the end, as it should.
 +- The internal copy of the Jasmine library has been updated to version 2.3.4, which brings in the minor bugfixes from 2.3.1, 2.3.2, and 2.3.3 as well.
 +- Thanks to Andy Holmes for contributing.
 +
 +## 2.3.0 - August 25, 2020
 +
 +- Added a `--debug` command line flag which will run the tests under GDB or the debugger of your choice.
 +- Added an `--interpreter` command line flag which allows using a different interpreter than whichever copy of `gjs` is in your path.
 +- Fixed several bugs around the loading of spec files.
 +- Improved error messages.
 +- Jasmine GJS now depends on GJS 1.58.0.
 +- The internal copy of the Jasmine library has been updated to 2.3.0, which brings:
 +  - `done.fail()` for asynchronous specs.
 +  - `toContain()` can be used for finding substrings.
 +  - `toThrow()` can be used to check that a particular value was thrown.
 +- Thanks to Niv Sardi, Bart Libert and Andy Holmes for contributing.
 +
 +## 2.2.1 - June 30, 2015
 +
 +- We now use `/usr/bin/env` to locate jasmine-gjs which allows Jasmine to be used with a development version of GJS. (Thanks to Sam Spilsbury)
 +- We don't exit with `System.exit()` on success, because that bypasses the GJS interpreter shutdown actions. (Thanks to Sam Spilsbury)
 +- The internal copy of the Jasmine library has been updated to version 2.2.1, which is a minor bugfix release.
 +
 +## 2.2.0 - May 17, 2015
 +
 +- You can now specify file patterns to exclude using the `--exclude`
 +  command line option.
 +  Previously you could only do this via the config file.
 +- You can now set environment variables in the config file using the
 +  `"environment"` key.
 +- When you specify a directory for JUnit reports to be placed in, that
 +  directory will now be created if it doesn't already exist.
 +- If the argument to `--junit` is not an absolute path, then the path
 +  will be resolved relative to the current directory.
 +  However, you can now resolve it relative to a different path by
 +  setting the environment variable `JASMINE_JUNIT_REPORTS_DIR`.
 +- The verbose and TAP reporters now report the reason why a spec has
 +  been marked pending, if any reason has been given.
 +- The internal copy of the Jasmine library has been updated to version
 +  2.2.0, including the following features:
 +  - the `toThrowError()` matcher to expect a particular exception
 +  - the `jasmine.anything()` object to match anything
 +  - the `jasmine.arrayContaining()` object to match an array containing
 +    all of the given objects
 +  - the `jasmine.stringMatching()` object to match a string that matches
 +    the given regular expression or substring
 +  - custom matching objects with `asymmetricMatch` methods
 +  - per-spec timeouts with an extra argument to `it()`, `beforeEach()`,
 +    and `afterEach()`
 +
 +## 2.1.3 - March 4, 2015
 +
 +- Initial release.
index b2f2bb11c2d0a2044b910a1aff5039f7567727ac,0000000000000000000000000000000000000000..1238766bc18bf87ee5cb0ed438817c7fbb5fe3cf
mode 100755,000000..100755
--- /dev/null
@@@ -1,34 -1,0 +1,34 @@@
- // Don't put any code after this; the return value is used as the exit code.
- await Command.run(_jasmine, ARGV, 10);
 +#!/usr/bin/env -S gjs -m
 +
 +/* global jasmineImporter */
 +
 +import GLib from 'gi://GLib';
++import System from 'system';
 +
 +const pkgdatadir = GLib.getenv('TEST_PKGDATADIR') ?? '@pkgdatadir@';
 +const jasmineMod = GLib.getenv('TEST_JASMINE_MOD') ?? '@jasmine_mod@';
 +
 +// Create a separate GJS importer object for Jasmine modules, so that Jasmine's
 +// modules are not exposed to test code (e.g. client code might have its own
 +// Utils module.)
 +// This means that all imports within Jasmine must use jasmineImporter rather
 +// than imports. That includes imports of Jasmine modules in the tests. It would
 +// be better to test a separate copy of Jasmine code, but importing most modules
 +// registers a GType, and we cannot register two GTypes with the same name in
 +// the same process.
 +
 +const oldSearchPath = imports.searchPath.slice();  // make a copy
 +imports.searchPath.unshift(GLib.path_get_dirname(pkgdatadir));
 +globalThis.jasmineImporter = imports[jasmineMod];
 +imports.searchPath = oldSearchPath;
 +
 +const base = `file://${pkgdatadir}`;
 +
 +const Command = await import(`${base}/command.js`);
 +const JasmineBoot = await import(`${base}/jasmineBoot.js`);
 +
 +// Do not conflict with global "jasmine" object
 +const _jasmine = new JasmineBoot.Jasmine();
 +_jasmine.installAPI(globalThis);
 +
++System.exit(await Command.run(_jasmine, ARGV, 10));
index ee57692579de5a7807ebb794d2230a0e130d556a,0000000000000000000000000000000000000000..2bf7d37c9649667a3e590a49f85c2e8b4ea41d81
mode 100755,000000..100755
--- /dev/null
@@@ -1,37 -1,0 +1,35 @@@
- import * as System from 'system';
 +#!/usr/bin/env -S gjs -m
 +
 +import GLib from 'gi://GLib';
- // Don't put any code after this; the return value is used as the exit code.
- (function () {
-     if (process.get_if_exited())
-         return process.get_exit_status();
-     return 1;
- })();
++import System from 'system';
 +
 +const pkglibexecdir = GLib.getenv('TEST_PKGLIBEXECDIR') ?? '@pkglibexecdir@';
 +const pkgdatadir = GLib.getenv('TEST_PKGDATADIR') ?? '@pkgdatadir@';
 +
 +const runnerPath = `${pkglibexecdir}/jasmine-runner`;
 +const base = `file://${pkgdatadir}`;
 +
 +const Config = await import(`${base}/config.js`);
 +const Options = await import(`${base}/options.js`);
 +
 +const [files, options] = Options.parseOptions(ARGV);
 +
 +if (options.version) {
 +    print('Jasmine @PACKAGE_VERSION@');
 +    System.exit(0);
 +}
 +
 +const config = Config.loadConfig(options);
 +
 +// Launch Jasmine in a subprocess so we can control the environment
 +const launcher = Config.prepareLauncher(config, options);
 +let args = Config.configToArgs(config, files, options);
 +args.unshift(runnerPath);  // argv[0]
 +args = Config.wrapArgs(args, config, options);
 +const process = launcher.spawnv(args);
 +process.wait(null);
 +
++if (process.get_if_exited())
++    System.exit(process.get_exit_status());
++
++System.exit(1);
index 02e243e9b0140c4626e20c7218e7c51fe1c6c1ad,0000000000000000000000000000000000000000..9db28c8caf54820f142c33f7eafc876e27238e29
mode 100644,000000..100644
--- /dev/null
@@@ -1,52 -1,0 +1,58 @@@
++jasmine-gjs (3.10.1-1) UNRELEASED; urgency=low
++
++  * Upgrade to 3.10.1
++
++ -- Philip Chimento <philip.chimento@gmail.com>  Sun, 14 Jul 2024 13:59:43 -0700
++
 +jasmine-gjs (2.6.4-1) unstable; urgency=low
 +
 +  * Upgrade to 2.6.4
 +
 + -- Andy Holmes <andrew.g.r.holmes@gmail.com>  Thu, 10 Sep 2020 21:47:34 -0700
 +
 +jasmine-gjs (2.5.2-1) unstable; urgency=low
 +
 +  * Upgrade to 2.5.2
 +
 + -- Andy Holmes <andrew.g.r.holmes@gmail.com>  Fri, 04 Sep 2020 19:20:51 -0700
 +
 +jasmine-gjs (2.4.1-1) unstable; urgency=low
 +
 +  * Upgrade to 2.4.1
 +
 + -- Andy Holmes <andrew.g.r.holmes@gmail.com>  Sat, 29 Aug 2020 19:46:28 -0700
 +
 +jasmine-gjs (2.3.4-1) unstable; urgency=low
 +
 +  * Upgrade to 2.3.4
 +
 + -- Andy Holmes <andrew.g.r.holmes@gmail.com>  Wed, 26 Aug 2020 16:34:43 -0700
 +
 +jasmine-gjs (2.3.0-1) unstable; urgency=low
 +
 +  * Upgrade to 2.3.0
 +  * control: Bump GJS requirement to 1.58.0
 +  * control, rules: Meson build system
 +  * control: Update to modern versions of standards and debhelper-compat
 +
 + -- Philip Chimento <philip.chimento@gmail.com>  Tue, 25 Aug 2020 22:19:41 -0700
 +
 +jasmine-gjs (2.2.1-1) unstable; urgency=low
 +
 +  * Upgrade to 2.2.1
 +
 + -- Philip Chimento <philip.chimento@gmail.com>  Tue, 30 Jun 2015 14:24:39 -0700
 +
 +jasmine-gjs (2.2.0-1) unstable; urgency=low
 +
 +  * Upgrade to 2.2.0
 +  * copyright: Update copyright year of upstream Jasmine
 +  * docs: Add new NEWS.md file
 +
 + -- Philip Chimento <philip.chimento@gmail.com>  Mon, 18 May 2015 01:03:37 -0700
 +
 +jasmine-gjs (2.1.3-1) unstable; urgency=low
 +
 +  * Initial release
 +
 + -- Philip Chimento <philip.chimento@gmail.com>  Sun, 01 Mar 2015 15:25:17 -0800
index 117ba70d921f5f54c41fb52b77ddf065a00f26c8,0000000000000000000000000000000000000000..c5403b0724b9c0144544fb9f8d88bef76448e3b8
mode 100644,000000..100644
--- /dev/null
@@@ -1,19 -1,0 +1,19 @@@
-                gjs (>= 1.58.0),
-                meson (>= 0.50.0)
 +Source: jasmine-gjs
 +Section: devel
 +Priority: optional
 +Maintainer: Philip Chimento <philip.chimento@gmail.com>
 +Build-Depends: debhelper-compat (= 12),
 +               gir1.2-glib-2.0,
-          gjs (>= 1.58.0)
++               gjs (>= 1.71.1),
++               meson (>= 0.58.0)
 +Standards-Version: 4.5.0
 +Homepage: https://github.com/ptomato/jasmine-gjs
 +
 +Package: jasmine-gjs
 +Architecture: all
 +Depends: ${misc:Depends},
 +         gir1.2-glib-2.0,
++         gjs (>= 1.71.1)
 +Description: Behavior-driven development framework for GJS
 + This module allows you to run Jasmine specs for your GJS code. The output will
 + be displayed in your terminal.
index 352b2e97440920d7a02bced41649dfd8621ae663,0000000000000000000000000000000000000000..3b576f6fad59874b8274d4a8095e88a5c919db01
mode 100644,000000..100644
--- /dev/null
@@@ -1,64 -1,0 +1,66 @@@
- Version: 2.6.4
 +Name: jasmine-gjs
- Source0: http://ptomato.name/downloads/jasmine-gjs-2.6.4.tar.xz
++Version: 3.10.1
 +Release: 1%{?dist}
 +Summary: A behavior-driven development framework for GJS
 +
 +License: MIT
 +URL: https://github.com/ptomato/jasmine-gjs
- BuildRequires: gjs >= 1.58.0
++Source0: https://github.com/ptomato/jasmine-gjs/releases/download/3.10.1/jasmine-gjs-3.10.1.tar.xz
 +
 +BuildArch: noarch
- BuildRequires: meson >= 0.50.0
- Requires: gjs >= 1.58.0
++BuildRequires: gjs >= 1.71.1
 +BuildRequires: gobject-introspection
- * Fri Sep 10 2020 Andy Holmes <andrew.g.r.holmes@gmail.com> - 2.6.4-1
++BuildRequires: meson >= 0.58.0
++Requires: gjs >= 1.71.1
 +Requires: gobject-introspection
 +
 +%description
 +This module allows you to run Jasmine specs for your GJS code. The output will
 +be displayed in your terminal.
 +
 +%prep
 +%autosetup
 +
 +
 +%build
 +%meson
 +%meson_build
 +
 +
 +%install
 +%meson_install
 +
 +
 +%check
 +%meson_test
 +
 +
 +%files
 +%doc README.md
 +%doc NEWS.md
 +%doc COPYING
 +%doc %{_mandir}/man1/jasmine.1.gz
 +%{_bindir}/jasmine
 +%{_libexecdir}/%{name}/
 +%{_datadir}/%{name}/
 +
 +
 +%changelog
++* Sun Jul 14 2024 Philip Chimento <philip.chimento@gmail.com> - 3.10.1-1
++- Update requirements for version 3.10.1.
++* Thu Sep 10 2020 Andy Holmes <andrew.g.r.holmes@gmail.com> - 2.6.4-1
 +- Update to version 2.6.4.
 +* Fri Sep 4 2020 Andy Holmes <andrew.g.r.holmes@gmail.com> - 2.5.2-1
 +- Update to version 2.5.2.
 +* Sat Aug 29 2020 Andy Holmes <andrew.g.r.holmes@gmail.com> - 2.4.1-1
 +- Update to version 2.4.1.
 +* Wed Aug 26 2020 Andy Holmes <andrew.g.r.holmes@gmail.com> - 2.3.4-1
 +- Update to version 2.3.4.
 +* Mon Aug 24 2020 Philip Chimento <philip.chimento@gmail.com> - 2.3.0-1
 +- Update to version 2.3.0.
 +* Tue Jun 30 2015 Philip Chimento <philip.chimento@gmail.com> - 2.2.1-1
 +- Update to version 2.2.1.
 +* Sun May 17 2015 Philip Chimento <philip.chimento@gmail.com> - 2.2.0-1
 +- Update to version 2.2.0.
 +* Wed Mar 4 2015 Philip Chimento <philip.chimento@gmail.com> - 2.1.3-1
 +- Initial packaging.
index 007712b255bfd3fa9309950887f59956fd2670a5,0000000000000000000000000000000000000000..6bbb4f2072bc91bb5bfd1cfbe78d834567678892
mode 100644,000000..100644
--- /dev/null
@@@ -1,10116 -1,0 +1,10766 @@@
- /* jscs:disable */
 +/*
- Copyright (c) 2008-2021 Pivotal Labs
++Copyright (c) 2008-2022 Pivotal Labs
 +
 +Permission is hereby granted, free of charge, to any person obtaining
 +a copy of this software and associated documentation files (the
 +"Software"), to deal in the Software without restriction, including
 +without limitation the rights to use, copy, modify, merge, publish,
 +distribute, sublicense, and/or sell copies of the Software, and to
 +permit persons to whom the Software is furnished to do so, subject to
 +the following conditions:
 +
 +The above copyright notice and this permission notice shall be
 +included in all copies or substantial portions of the Software.
 +
 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 +*/
 +// eslint-disable-next-line no-unused-vars
 +var getJasmineRequireObj = (function(jasmineGlobal) {
 +  var jasmineRequire;
 +
 +  if (
 +    typeof module !== 'undefined' &&
 +    module.exports &&
 +    typeof exports !== 'undefined'
 +  ) {
 +    if (typeof global !== 'undefined') {
 +      jasmineGlobal = global;
 +    } else {
 +      jasmineGlobal = {};
 +    }
 +    jasmineRequire = exports;
 +  } else {
 +    if (
 +      typeof window !== 'undefined' &&
 +      typeof window.toString === 'function' &&
 +      window.toString() === '[object GjsGlobal]'
 +    ) {
 +      jasmineGlobal = window;
 +    }
 +    jasmineRequire = jasmineGlobal.jasmineRequire = {};
 +  }
 +
 +  function getJasmineRequire() {
 +    return jasmineRequire;
 +  }
 +
 +  getJasmineRequire().core = function(jRequire) {
 +    var j$ = {};
 +
 +    jRequire.base(j$, jasmineGlobal);
 +    j$.util = jRequire.util(j$);
 +    j$.errors = jRequire.errors();
 +    j$.formatErrorMsg = jRequire.formatErrorMsg();
 +    j$.Any = jRequire.Any(j$);
 +    j$.Anything = jRequire.Anything(j$);
 +    j$.CallTracker = jRequire.CallTracker(j$);
-     j$.MockDate = jRequire.MockDate();
++    j$.MockDate = jRequire.MockDate(j$);
 +    j$.getClearStack = jRequire.clearStack(j$);
 +    j$.Clock = jRequire.Clock();
 +    j$.DelayedFunctionScheduler = jRequire.DelayedFunctionScheduler(j$);
++    j$.Deprecator = jRequire.Deprecator(j$);
 +    j$.Env = jRequire.Env(j$);
++    j$.deprecatingThisProxy = jRequire.deprecatingThisProxy(j$);
++    j$.deprecatingSuiteProxy = jRequire.deprecatingSuiteProxy(j$);
++    j$.deprecatingSpecProxy = jRequire.deprecatingSpecProxy(j$);
 +    j$.StackTrace = jRequire.StackTrace(j$);
 +    j$.ExceptionFormatter = jRequire.ExceptionFormatter(j$);
 +    j$.ExpectationFilterChain = jRequire.ExpectationFilterChain();
 +    j$.Expector = jRequire.Expector(j$);
 +    j$.Expectation = jRequire.Expectation(j$);
 +    j$.buildExpectationResult = jRequire.buildExpectationResult(j$);
 +    j$.JsApiReporter = jRequire.JsApiReporter(j$);
 +    j$.asymmetricEqualityTesterArgCompatShim = jRequire.asymmetricEqualityTesterArgCompatShim(
 +      j$
 +    );
 +    j$.makePrettyPrinter = jRequire.makePrettyPrinter(j$);
-     j$.pp = j$.makePrettyPrinter();
++    j$.basicPrettyPrinter_ = j$.makePrettyPrinter();
++    Object.defineProperty(j$, 'pp', {
++      get: function() {
++        j$.getEnv().deprecated(
++          'jasmine.pp is deprecated and will be removed in a future release. ' +
++            'Use the pp method of the matchersUtil passed to the matcher factory ' +
++            "or the asymmetric equality tester's `asymmetricMatch` method " +
++            'instead. See ' +
++            '<https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#static-utils> for details.'
++        );
++        return j$.basicPrettyPrinter_;
++      }
++    });
 +    j$.MatchersUtil = jRequire.MatchersUtil(j$);
-     j$.matchersUtil = new j$.MatchersUtil({
++    var staticMatchersUtil = new j$.MatchersUtil({
 +      customTesters: [],
-       pp: j$.pp
++      pp: j$.basicPrettyPrinter_
++    });
++    Object.defineProperty(j$, 'matchersUtil', {
++      get: function() {
++        j$.getEnv().deprecated(
++          'jasmine.matchersUtil is deprecated and will be removed ' +
++            'in a future release. Use the instance passed to the matcher factory or ' +
++            "the asymmetric equality tester's `asymmetricMatch` method instead. " +
++            'See <https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#static-utils> for details.'
++        );
++        return staticMatchersUtil;
++      }
 +    });
 +
 +    j$.ObjectContaining = jRequire.ObjectContaining(j$);
 +    j$.ArrayContaining = jRequire.ArrayContaining(j$);
 +    j$.ArrayWithExactContents = jRequire.ArrayWithExactContents(j$);
 +    j$.MapContaining = jRequire.MapContaining(j$);
 +    j$.SetContaining = jRequire.SetContaining(j$);
 +    j$.QueueRunner = jRequire.QueueRunner(j$);
 +    j$.ReportDispatcher = jRequire.ReportDispatcher(j$);
 +    j$.Spec = jRequire.Spec(j$);
 +    j$.Spy = jRequire.Spy(j$);
 +    j$.SpyFactory = jRequire.SpyFactory(j$);
 +    j$.SpyRegistry = jRequire.SpyRegistry(j$);
 +    j$.SpyStrategy = jRequire.SpyStrategy(j$);
 +    j$.StringMatching = jRequire.StringMatching(j$);
 +    j$.StringContaining = jRequire.StringContaining(j$);
 +    j$.UserContext = jRequire.UserContext(j$);
 +    j$.Suite = jRequire.Suite(j$);
 +    j$.Timer = jRequire.Timer();
 +    j$.TreeProcessor = jRequire.TreeProcessor();
 +    j$.version = jRequire.version();
 +    j$.Order = jRequire.Order();
 +    j$.DiffBuilder = jRequire.DiffBuilder(j$);
 +    j$.NullDiffBuilder = jRequire.NullDiffBuilder(j$);
 +    j$.ObjectPath = jRequire.ObjectPath(j$);
 +    j$.MismatchTree = jRequire.MismatchTree(j$);
 +    j$.GlobalErrors = jRequire.GlobalErrors(j$);
 +
 +    j$.Truthy = jRequire.Truthy(j$);
 +    j$.Falsy = jRequire.Falsy(j$);
 +    j$.Empty = jRequire.Empty(j$);
 +    j$.NotEmpty = jRequire.NotEmpty(j$);
 +
 +    j$.matchers = jRequire.requireMatchers(jRequire, j$);
 +    j$.asyncMatchers = jRequire.requireAsyncMatchers(jRequire, j$);
 +
 +    return j$;
 +  };
 +
 +  return getJasmineRequire;
 +})(this);
 +
 +getJasmineRequireObj().requireMatchers = function(jRequire, j$) {
 +  var availableMatchers = [
 +      'nothing',
 +      'toBe',
 +      'toBeCloseTo',
 +      'toBeDefined',
 +      'toBeInstanceOf',
 +      'toBeFalse',
 +      'toBeFalsy',
 +      'toBeGreaterThan',
 +      'toBeGreaterThanOrEqual',
 +      'toBeLessThan',
 +      'toBeLessThanOrEqual',
 +      'toBeNaN',
 +      'toBeNegativeInfinity',
 +      'toBeNull',
 +      'toBePositiveInfinity',
 +      'toBeTrue',
 +      'toBeTruthy',
 +      'toBeUndefined',
 +      'toContain',
 +      'toEqual',
 +      'toHaveSize',
 +      'toHaveBeenCalled',
 +      'toHaveBeenCalledBefore',
 +      'toHaveBeenCalledOnceWith',
 +      'toHaveBeenCalledTimes',
 +      'toHaveBeenCalledWith',
 +      'toHaveClass',
 +      'toMatch',
 +      'toThrow',
 +      'toThrowError',
 +      'toThrowMatching'
 +    ],
 +    matchers = {};
 +
 +  for (var i = 0; i < availableMatchers.length; i++) {
 +    var name = availableMatchers[i];
 +    matchers[name] = jRequire[name](j$);
 +  }
 +
 +  return matchers;
 +};
 +
 +getJasmineRequireObj().base = function(j$, jasmineGlobal) {
 +  j$.unimplementedMethod_ = function() {
 +    throw new Error('unimplemented method');
 +  };
 +
 +  /**
 +   * Maximum object depth the pretty printer will print to.
 +   * Set this to a lower value to speed up pretty printing if you have large objects.
 +   * @name jasmine.MAX_PRETTY_PRINT_DEPTH
 +   * @default 8
 +   * @since 1.3.0
 +   */
 +  j$.MAX_PRETTY_PRINT_DEPTH = 8;
 +  /**
 +   * Maximum number of array elements to display when pretty printing objects.
 +   * This will also limit the number of keys and values displayed for an object.
 +   * Elements past this number will be ellipised.
 +   * @name jasmine.MAX_PRETTY_PRINT_ARRAY_LENGTH
 +   * @default 50
 +   * @since 2.7.0
 +   */
 +  j$.MAX_PRETTY_PRINT_ARRAY_LENGTH = 50;
 +  /**
 +   * Maximum number of characters to display when pretty printing objects.
 +   * Characters past this number will be ellipised.
 +   * @name jasmine.MAX_PRETTY_PRINT_CHARS
 +   * @default 100
 +   * @since 2.9.0
 +   */
 +  j$.MAX_PRETTY_PRINT_CHARS = 1000;
 +  /**
 +   * Default number of milliseconds Jasmine will wait for an asynchronous spec,
 +   * before, or after function to complete. This can be overridden on a case by
 +   * case basis by passing a time limit as the third argument to {@link it},
 +   * {@link beforeEach}, {@link afterEach}, {@link beforeAll}, or
 +   * {@link afterAll}. The value must be no greater than the largest number of
 +   * milliseconds supported by setTimeout, which is usually 2147483647.
 +   *
 +   * While debugging tests, you may want to set this to a large number (or pass
 +   * a large number to one of the functions mentioned above) so that Jasmine
 +   * does not move on to after functions or the next spec while you're debugging.
 +   * @name jasmine.DEFAULT_TIMEOUT_INTERVAL
 +   * @default 5000
 +   * @since 1.3.0
 +   */
 +  var DEFAULT_TIMEOUT_INTERVAL = 5000;
 +  Object.defineProperty(j$, 'DEFAULT_TIMEOUT_INTERVAL', {
 +    get: function() {
 +      return DEFAULT_TIMEOUT_INTERVAL;
 +    },
 +    set: function(newValue) {
 +      j$.util.validateTimeout(newValue, 'jasmine.DEFAULT_TIMEOUT_INTERVAL');
 +      DEFAULT_TIMEOUT_INTERVAL = newValue;
 +    }
 +  });
 +
 +  j$.getGlobal = function() {
 +    return jasmineGlobal;
 +  };
 +
 +  /**
 +   * Get the currently booted Jasmine Environment.
 +   *
 +   * @name jasmine.getEnv
 +   * @since 1.3.0
 +   * @function
 +   * @return {Env}
 +   */
 +  j$.getEnv = function(options) {
 +    var env = (j$.currentEnv_ = j$.currentEnv_ || new j$.Env(options));
 +    //jasmine. singletons in here (setTimeout blah blah).
 +    return env;
 +  };
 +
 +  j$.isArray_ = function(value) {
 +    return j$.isA_('Array', value);
 +  };
 +
 +  j$.isObject_ = function(value) {
 +    return (
 +      !j$.util.isUndefined(value) && value !== null && j$.isA_('Object', value)
 +    );
 +  };
 +
 +  j$.isString_ = function(value) {
 +    return j$.isA_('String', value);
 +  };
 +
 +  j$.isNumber_ = function(value) {
 +    return j$.isA_('Number', value);
 +  };
 +
 +  j$.isFunction_ = function(value) {
 +    return j$.isA_('Function', value);
 +  };
 +
 +  j$.isAsyncFunction_ = function(value) {
 +    return j$.isA_('AsyncFunction', value);
 +  };
 +
 +  j$.isGeneratorFunction_ = function(value) {
 +    return j$.isA_('GeneratorFunction', value);
 +  };
 +
 +  j$.isTypedArray_ = function(value) {
 +    return (
 +      j$.isA_('Float32Array', value) ||
 +      j$.isA_('Float64Array', value) ||
 +      j$.isA_('Int16Array', value) ||
 +      j$.isA_('Int32Array', value) ||
 +      j$.isA_('Int8Array', value) ||
 +      j$.isA_('Uint16Array', value) ||
 +      j$.isA_('Uint32Array', value) ||
 +      j$.isA_('Uint8Array', value) ||
 +      j$.isA_('Uint8ClampedArray', value)
 +    );
 +  };
 +
 +  j$.isA_ = function(typeName, value) {
 +    return j$.getType_(value) === '[object ' + typeName + ']';
 +  };
 +
 +  j$.isError_ = function(value) {
 +    if (!value) {
 +      return false;
 +    }
 +
 +    if (value instanceof Error) {
 +      return true;
 +    }
 +    if (
 +      typeof window !== 'undefined' &&
 +      typeof window.trustedTypes !== 'undefined'
 +    ) {
 +      return (
 +        typeof value.stack === 'string' && typeof value.message === 'string'
 +      );
 +    }
 +    if (value && value.constructor && value.constructor.constructor) {
 +      var valueGlobal = value.constructor.constructor('return this');
 +      if (j$.isFunction_(valueGlobal)) {
 +        valueGlobal = valueGlobal();
 +      }
 +
 +      if (valueGlobal.Error && value instanceof valueGlobal.Error) {
 +        return true;
 +      }
 +    }
 +    return false;
 +  };
 +
 +  j$.isAsymmetricEqualityTester_ = function(obj) {
-     return obj?.asymmetricMatch ? j$.isA_('Function', obj.asymmetricMatch) : false;
++    return obj ? j$.isA_('Function', obj.asymmetricMatch) : false;
 +  };
 +
 +  j$.getType_ = function(value) {
 +    return Object.prototype.toString.apply(value);
 +  };
 +
 +  j$.isDomNode = function(obj) {
 +    // Node is a function, because constructors
 +    return typeof jasmineGlobal.Node !== 'undefined'
 +      ? obj instanceof jasmineGlobal.Node
 +      : obj !== null &&
 +          typeof obj === 'object' &&
 +          typeof obj.nodeType === 'number' &&
 +          typeof obj.nodeName === 'string';
 +    // return obj.nodeType > 0;
 +  };
 +
 +  j$.isMap = function(obj) {
 +    return (
 +      obj !== null &&
 +      typeof obj !== 'undefined' &&
 +      typeof jasmineGlobal.Map !== 'undefined' &&
 +      obj.constructor === jasmineGlobal.Map
 +    );
 +  };
 +
 +  j$.isSet = function(obj) {
 +    return (
 +      obj !== null &&
 +      typeof obj !== 'undefined' &&
 +      typeof jasmineGlobal.Set !== 'undefined' &&
 +      obj.constructor === jasmineGlobal.Set
 +    );
 +  };
 +
 +  j$.isWeakMap = function(obj) {
 +    return (
 +      obj !== null &&
 +      typeof obj !== 'undefined' &&
 +      typeof jasmineGlobal.WeakMap !== 'undefined' &&
 +      obj.constructor === jasmineGlobal.WeakMap
 +    );
 +  };
 +
 +  j$.isURL = function(obj) {
 +    return (
 +      obj !== null &&
 +      typeof obj !== 'undefined' &&
 +      typeof jasmineGlobal.URL !== 'undefined' &&
 +      obj.constructor === jasmineGlobal.URL
 +    );
 +  };
 +
 +  j$.isDataView = function(obj) {
 +    return (
 +      obj !== null &&
 +      typeof obj !== 'undefined' &&
 +      typeof jasmineGlobal.DataView !== 'undefined' &&
 +      obj.constructor === jasmineGlobal.DataView
 +    );
 +  };
 +
 +  j$.isPromise = function(obj) {
 +    return (
 +      typeof jasmineGlobal.Promise !== 'undefined' &&
 +      !!obj &&
 +      obj.constructor === jasmineGlobal.Promise
 +    );
 +  };
 +
 +  j$.isPromiseLike = function(obj) {
 +    return !!obj && j$.isFunction_(obj.then);
 +  };
 +
 +  j$.fnNameFor = function(func) {
 +    if (func.name) {
 +      return func.name;
 +    }
 +
 +    var matches =
 +      func.toString().match(/^\s*function\s*(\w+)\s*\(/) ||
 +      func.toString().match(/^\s*\[object\s*(\w+)Constructor\]/);
 +
 +    return matches ? matches[1] : '<anonymous>';
 +  };
 +
 +  j$.isPending_ = function(promise) {
 +    var sentinel = {};
 +    // eslint-disable-next-line compat/compat
 +    return Promise.race([promise, Promise.resolve(sentinel)]).then(
 +      function(result) {
 +        return result === sentinel;
 +      },
 +      function() {
 +        return false;
 +      }
 +    );
 +  };
 +
 +  /**
 +   * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
 +   * that will succeed if the actual value being compared is an instance of the specified class/constructor.
 +   * @name jasmine.any
 +   * @since 1.3.0
 +   * @function
 +   * @param {Constructor} clazz - The constructor to check against.
 +   */
 +  j$.any = function(clazz) {
 +    return new j$.Any(clazz);
 +  };
 +
 +  /**
 +   * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
 +   * that will succeed if the actual value being compared is not `null` and not `undefined`.
 +   * @name jasmine.anything
 +   * @since 2.2.0
 +   * @function
 +   */
 +  j$.anything = function() {
 +    return new j$.Anything();
 +  };
 +
 +  /**
 +   * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
 +   * that will succeed if the actual value being compared is `true` or anything truthy.
 +   * @name jasmine.truthy
 +   * @since 3.1.0
 +   * @function
 +   */
 +  j$.truthy = function() {
 +    return new j$.Truthy();
 +  };
 +
 +  /**
 +   * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
 +   * that will succeed if the actual value being compared is  `null`, `undefined`, `0`, `false` or anything falsey.
 +   * @name jasmine.falsy
 +   * @since 3.1.0
 +   * @function
 +   */
 +  j$.falsy = function() {
 +    return new j$.Falsy();
 +  };
 +
 +  /**
 +   * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
 +   * that will succeed if the actual value being compared is empty.
 +   * @name jasmine.empty
 +   * @since 3.1.0
 +   * @function
 +   */
 +  j$.empty = function() {
 +    return new j$.Empty();
 +  };
 +
 +  /**
 +   * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
 +   * that will succeed if the actual value being compared is not empty.
 +   * @name jasmine.notEmpty
 +   * @since 3.1.0
 +   * @function
 +   */
 +  j$.notEmpty = function() {
 +    return new j$.NotEmpty();
 +  };
 +
 +  /**
 +   * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
 +   * that will succeed if the actual value being compared contains at least the keys and values.
 +   * @name jasmine.objectContaining
 +   * @since 1.3.0
 +   * @function
 +   * @param {Object} sample - The subset of properties that _must_ be in the actual.
 +   */
 +  j$.objectContaining = function(sample) {
 +    return new j$.ObjectContaining(sample);
 +  };
 +
 +  /**
 +   * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
 +   * that will succeed if the actual value is a `String` that matches the `RegExp` or `String`.
 +   * @name jasmine.stringMatching
 +   * @since 2.2.0
 +   * @function
 +   * @param {RegExp|String} expected
 +   */
 +  j$.stringMatching = function(expected) {
 +    return new j$.StringMatching(expected);
 +  };
 +
 +  /**
 +   * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
 +   * that will succeed if the actual value is a `String` that contains the specified `String`.
 +   * @name jasmine.stringContaining
 +   * @since 3.10.0
 +   * @function
 +   * @param {String} expected
 +   */
 +  j$.stringContaining = function(expected) {
 +    return new j$.StringContaining(expected);
 +  };
 +
 +  /**
 +   * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
 +   * that will succeed if the actual value is an `Array` that contains at least the elements in the sample.
 +   * @name jasmine.arrayContaining
 +   * @since 2.2.0
 +   * @function
 +   * @param {Array} sample
 +   */
 +  j$.arrayContaining = function(sample) {
 +    return new j$.ArrayContaining(sample);
 +  };
 +
 +  /**
 +   * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
 +   * that will succeed if the actual value is an `Array` that contains all of the elements in the sample in any order.
 +   * @name jasmine.arrayWithExactContents
 +   * @since 2.8.0
 +   * @function
 +   * @param {Array} sample
 +   */
 +  j$.arrayWithExactContents = function(sample) {
 +    return new j$.ArrayWithExactContents(sample);
 +  };
 +
 +  /**
 +   * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
 +   * that will succeed if every key/value pair in the sample passes the deep equality comparison
 +   * with at least one key/value pair in the actual value being compared
 +   * @name jasmine.mapContaining
 +   * @since 3.5.0
 +   * @function
 +   * @param {Map} sample - The subset of items that _must_ be in the actual.
 +   */
 +  j$.mapContaining = function(sample) {
 +    return new j$.MapContaining(sample);
 +  };
 +
 +  /**
 +   * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
 +   * that will succeed if every item in the sample passes the deep equality comparison
 +   * with at least one item in the actual value being compared
 +   * @name jasmine.setContaining
 +   * @since 3.5.0
 +   * @function
 +   * @param {Set} sample - The subset of items that _must_ be in the actual.
 +   */
 +  j$.setContaining = function(sample) {
 +    return new j$.SetContaining(sample);
 +  };
 +
 +  /**
 +   * Determines whether the provided function is a Jasmine spy.
 +   * @name jasmine.isSpy
 +   * @since 2.0.0
 +   * @function
 +   * @param {Function} putativeSpy - The function to check.
 +   * @return {Boolean}
 +   */
 +  j$.isSpy = function(putativeSpy) {
-     if (!putativeSpy || !putativeSpy.and) {
++    if (!putativeSpy) {
 +      return false;
 +    }
 +    return (
 +      putativeSpy.and instanceof j$.SpyStrategy &&
 +      putativeSpy.calls instanceof j$.CallTracker
 +    );
 +  };
 +};
 +
 +getJasmineRequireObj().util = function(j$) {
 +  var util = {};
 +
 +  util.inherit = function(childClass, parentClass) {
 +    var Subclass = function() {};
 +    Subclass.prototype = parentClass.prototype;
 +    childClass.prototype = new Subclass();
 +  };
 +
 +  util.argsToArray = function(args) {
 +    var arrayOfArgs = [];
 +    for (var i = 0; i < args.length; i++) {
 +      arrayOfArgs.push(args[i]);
 +    }
 +    return arrayOfArgs;
 +  };
 +
 +  util.isUndefined = function(obj) {
 +    return obj === void 0;
 +  };
 +
 +  util.arrayContains = function(array, search) {
 +    var i = array.length;
 +    while (i--) {
 +      if (array[i] === search) {
 +        return true;
 +      }
 +    }
 +    return false;
 +  };
 +
 +  util.clone = function(obj) {
 +    if (Object.prototype.toString.apply(obj) === '[object Array]') {
 +      return obj.slice();
 +    }
 +
 +    var cloned = {};
 +    for (var prop in obj) {
 +      if (obj.hasOwnProperty(prop)) {
 +        cloned[prop] = obj[prop];
 +      }
 +    }
 +
 +    return cloned;
 +  };
 +
 +  util.cloneArgs = function(args) {
 +    var clonedArgs = [];
 +    var argsAsArray = j$.util.argsToArray(args);
 +    for (var i = 0; i < argsAsArray.length; i++) {
 +      var str = Object.prototype.toString.apply(argsAsArray[i]),
 +        primitives = /^\[object (Boolean|String|RegExp|Number)/;
 +
 +      // All falsey values are either primitives, `null`, or `undefined.
 +      if (!argsAsArray[i] || str.match(primitives)) {
 +        clonedArgs.push(argsAsArray[i]);
 +      } else {
 +        clonedArgs.push(j$.util.clone(argsAsArray[i]));
 +      }
 +    }
 +    return clonedArgs;
 +  };
 +
 +  util.getPropertyDescriptor = function(obj, methodName) {
 +    var descriptor,
 +      proto = obj;
 +
 +    do {
 +      descriptor = Object.getOwnPropertyDescriptor(proto, methodName);
 +      proto = Object.getPrototypeOf(proto);
 +    } while (!descriptor && proto);
 +
 +    return descriptor;
 +  };
 +
 +  util.objectDifference = function(obj, toRemove) {
 +    var diff = {};
 +
 +    for (var key in obj) {
 +      if (util.has(obj, key) && !util.has(toRemove, key)) {
 +        diff[key] = obj[key];
 +      }
 +    }
 +
 +    return diff;
 +  };
 +
 +  util.has = function(obj, key) {
 +    return Object.prototype.hasOwnProperty.call(obj, key);
 +  };
 +
 +  util.errorWithStack = function errorWithStack() {
 +    // Don't throw and catch if we don't have to, because it makes it harder
 +    // for users to debug their code with exception breakpoints.
 +    var error = new Error();
 +
 +    if (error.stack) {
 +      return error;
 +    }
 +
 +    // But some browsers (e.g. Phantom) only provide a stack trace if we throw.
 +    try {
 +      throw new Error();
 +    } catch (e) {
 +      return e;
 +    }
 +  };
 +
 +  function callerFile() {
 +    var trace = new j$.StackTrace(util.errorWithStack());
 +    return trace.frames[2].file;
 +  }
 +
 +  util.jasmineFile = (function() {
 +    var result;
 +
 +    return function() {
 +      if (!result) {
 +        result = callerFile();
 +      }
 +
 +      return result;
 +    };
 +  })();
 +
 +  function StopIteration() {}
 +  StopIteration.prototype = Object.create(Error.prototype);
 +  StopIteration.prototype.constructor = StopIteration;
 +
 +  // useful for maps and sets since `forEach` is the only IE11-compatible way to iterate them
 +  util.forEachBreakable = function(iterable, iteratee) {
 +    function breakLoop() {
 +      throw new StopIteration();
 +    }
 +
 +    try {
 +      iterable.forEach(function(value, key) {
 +        iteratee(breakLoop, value, key, iterable);
 +      });
 +    } catch (error) {
 +      if (!(error instanceof StopIteration)) throw error;
 +    }
 +  };
 +
 +  util.validateTimeout = function(timeout, msgPrefix) {
 +    // Timeouts are implemented with setTimeout, which only supports a limited
 +    // range of values. The limit is unspecified, as is the behavior when it's
 +    // exceeded. But on all currently supported JS runtimes, setTimeout calls
 +    // the callback immediately when the timeout is greater than 2147483647
 +    // (the maximum value of a signed 32 bit integer).
 +    var max = 2147483647;
 +
 +    if (timeout > max) {
 +      throw new Error(
 +        (msgPrefix || 'Timeout value') + ' cannot be greater than ' + max
 +      );
 +    }
 +  };
 +
 +  return util;
 +};
 +
 +getJasmineRequireObj().Spec = function(j$) {
 +  /**
 +   * @interface Spec
 +   * @see Configuration#specFilter
 +   * @since 2.0.0
 +   */
 +  function Spec(attrs) {
 +    this.expectationFactory = attrs.expectationFactory;
 +    this.asyncExpectationFactory = attrs.asyncExpectationFactory;
 +    this.resultCallback = attrs.resultCallback || function() {};
 +    /**
 +     * The unique ID of this spec.
 +     * @name Spec#id
 +     * @readonly
 +     * @type {string}
 +     * @since 2.0.0
 +     */
 +    this.id = attrs.id;
 +    /**
 +     * The description passed to the {@link it} that created this spec.
 +     * @name Spec#description
 +     * @readonly
 +     * @type {string}
 +     * @since 2.0.0
 +     */
 +    this.description = attrs.description || '';
 +    this.queueableFn = attrs.queueableFn;
 +    this.beforeAndAfterFns =
 +      attrs.beforeAndAfterFns ||
 +      function() {
 +        return { befores: [], afters: [] };
 +      };
 +    this.userContext =
 +      attrs.userContext ||
 +      function() {
 +        return {};
 +      };
 +    this.onStart = attrs.onStart || function() {};
 +    this.autoCleanClosures =
 +      attrs.autoCleanClosures === undefined ? true : !!attrs.autoCleanClosures;
 +    this.getSpecName =
 +      attrs.getSpecName ||
 +      function() {
 +        return '';
 +      };
 +    this.expectationResultFactory =
 +      attrs.expectationResultFactory || function() {};
++    this.deprecated = attrs.deprecated || function() {};
 +    this.queueRunnerFactory = attrs.queueRunnerFactory || function() {};
 +    this.catchingExceptions =
 +      attrs.catchingExceptions ||
 +      function() {
 +        return true;
 +      };
 +    this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure;
 +    this.timer = attrs.timer || new j$.Timer();
 +
 +    if (!this.queueableFn.fn) {
 +      this.exclude();
 +    }
 +
 +    /**
 +     * @typedef SpecResult
 +     * @property {Int} id - The unique id of this spec.
 +     * @property {String} description - The description passed to the {@link it} that created this spec.
 +     * @property {String} fullName - The full description including all ancestors of this spec.
 +     * @property {Expectation[]} failedExpectations - The list of expectations that failed during execution of this spec.
 +     * @property {Expectation[]} passedExpectations - The list of expectations that passed during execution of this spec.
 +     * @property {Expectation[]} deprecationWarnings - The list of deprecation warnings that occurred during execution this spec.
 +     * @property {String} pendingReason - If the spec is {@link pending}, this will be the reason.
 +     * @property {String} status - Once the spec has completed, this string represents the pass/fail status of this spec.
 +     * @property {number} duration - The time in ms used by the spec execution, including any before/afterEach.
 +     * @property {Object} properties - User-supplied properties, if any, that were set using {@link Env#setSpecProperty}
 +     * @since 2.0.0
 +x     */
 +    this.result = {
 +      id: this.id,
 +      description: this.description,
 +      fullName: this.getFullName(),
 +      failedExpectations: [],
 +      passedExpectations: [],
 +      deprecationWarnings: [],
 +      pendingReason: '',
 +      duration: null,
 +      properties: null
 +    };
 +  }
 +
 +  Spec.prototype.addExpectationResult = function(passed, data, isError) {
 +    var expectationResult = this.expectationResultFactory(data);
 +    if (passed) {
 +      this.result.passedExpectations.push(expectationResult);
 +    } else {
 +      this.result.failedExpectations.push(expectationResult);
 +
 +      if (this.throwOnExpectationFailure && !isError) {
 +        throw new j$.errors.ExpectationFailed();
 +      }
 +    }
 +  };
 +
 +  Spec.prototype.setSpecProperty = function(key, value) {
 +    this.result.properties = this.result.properties || {};
 +    this.result.properties[key] = value;
 +  };
 +
 +  Spec.prototype.expect = function(actual) {
 +    return this.expectationFactory(actual, this);
 +  };
 +
 +  Spec.prototype.expectAsync = function(actual) {
 +    return this.asyncExpectationFactory(actual, this);
 +  };
 +
 +  Spec.prototype.execute = function(onComplete, excluded, failSpecWithNoExp) {
 +    var self = this;
 +
 +    var onStart = {
 +      fn: function(done) {
 +        self.timer.start();
 +        self.onStart(self, done);
 +      }
 +    };
 +
 +    var complete = {
 +      fn: function(done) {
 +        if (self.autoCleanClosures) {
 +          self.queueableFn.fn = null;
 +        }
 +        self.result.status = self.status(excluded, failSpecWithNoExp);
 +        self.result.duration = self.timer.elapsed();
 +        self.resultCallback(self.result, done);
 +      }
 +    };
 +
 +    var fns = this.beforeAndAfterFns();
 +    var regularFns = fns.befores.concat(this.queueableFn);
 +
 +    var runnerConfig = {
 +      isLeaf: true,
 +      queueableFns: regularFns,
 +      cleanupFns: fns.afters,
 +      onException: function() {
 +        self.onException.apply(self, arguments);
 +      },
-       onComplete: function() {
-         onComplete(
-           self.result.status === 'failed' &&
-             new j$.StopExecutionError('spec failed')
++      onMultipleDone: function() {
++        // Issue a deprecation. Include the context ourselves and pass
++        // ignoreRunnable: true, since getting here always means that we've already
++        // moved on and the current runnable isn't the one that caused the problem.
++        self.deprecated(
++          "An asynchronous function called its 'done' " +
++            'callback more than once. This is a bug in the spec, beforeAll, ' +
++            'beforeEach, afterAll, or afterEach function in question. This will ' +
++            'be treated as an error in a future version. See' +
++            '<https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#deprecations-due-to-calling-done-multiple-times> ' +
++            'for more information.\n' +
++            '(in spec: ' +
++            self.getFullName() +
++            ')',
++          { ignoreRunnable: true }
 +        );
 +      },
-       userContext: this.userContext()
++      onComplete: function() {
++        if (self.result.status === 'failed') {
++          onComplete(new j$.StopExecutionError('spec failed'));
++        } else {
++          onComplete();
++        }
++      },
++      userContext: this.userContext(),
++      runnableName: this.getFullName.bind(this)
 +    };
 +
 +    if (this.markedPending || excluded === true) {
 +      runnerConfig.queueableFns = [];
 +      runnerConfig.cleanupFns = [];
 +    }
 +
 +    runnerConfig.queueableFns.unshift(onStart);
 +    runnerConfig.cleanupFns.push(complete);
 +
 +    this.queueRunnerFactory(runnerConfig);
 +  };
 +
 +  Spec.prototype.reset = function() {
 +    /**
 +     * @typedef SpecResult
 +     * @property {Int} id - The unique id of this spec.
 +     * @property {String} description - The description passed to the {@link it} that created this spec.
 +     * @property {String} fullName - The full description including all ancestors of this spec.
 +     * @property {Expectation[]} failedExpectations - The list of expectations that failed during execution of this spec.
 +     * @property {Expectation[]} passedExpectations - The list of expectations that passed during execution of this spec.
 +     * @property {Expectation[]} deprecationWarnings - The list of deprecation warnings that occurred during execution this spec.
 +     * @property {String} pendingReason - If the spec is {@link pending}, this will be the reason.
 +     * @property {String} status - Once the spec has completed, this string represents the pass/fail status of this spec.
 +     * @property {number} duration - The time in ms used by the spec execution, including any before/afterEach.
 +     * @property {Object} properties - User-supplied properties, if any, that were set using {@link Env#setSpecProperty}
 +     * @since 2.0.0
 +     */
 +    this.result = {
 +      id: this.id,
 +      description: this.description,
 +      fullName: this.getFullName(),
 +      failedExpectations: [],
 +      passedExpectations: [],
 +      deprecationWarnings: [],
 +      pendingReason: this.excludeMessage,
 +      duration: null,
 +      properties: null,
 +      trace: null
 +    };
 +    this.markedPending = this.markedExcluding;
 +  };
 +
 +  Spec.prototype.onException = function onException(e) {
 +    if (Spec.isPendingSpecException(e)) {
 +      this.pend(extractCustomPendingMessage(e));
 +      return;
 +    }
 +
 +    if (e instanceof j$.errors.ExpectationFailed) {
 +      return;
 +    }
 +
 +    this.addExpectationResult(
 +      false,
 +      {
 +        matcherName: '',
 +        passed: false,
 +        expected: '',
 +        actual: '',
 +        error: e
 +      },
 +      true
 +    );
 +  };
 +
 +  /*
 +   * Marks state as pending
 +   * @param {string} [message] An optional reason message
 +   */
 +  Spec.prototype.pend = function(message) {
 +    this.markedPending = true;
 +    if (message) {
 +      this.result.pendingReason = message;
 +    }
 +  };
 +
 +  /*
 +   * Like {@link Spec#pend}, but pending state will survive {@link Spec#reset}
 +   * Useful for fit, xit, where pending state remains.
 +   * @param {string} [message] An optional reason message
 +   */
 +  Spec.prototype.exclude = function(message) {
 +    this.markedExcluding = true;
 +    if (this.message) {
 +      this.excludeMessage = message;
 +    }
 +    this.pend(message);
 +  };
 +
 +  Spec.prototype.getResult = function() {
 +    this.result.status = this.status();
 +    return this.result;
 +  };
 +
 +  Spec.prototype.status = function(excluded, failSpecWithNoExpectations) {
 +    if (excluded === true) {
 +      return 'excluded';
 +    }
 +
 +    if (this.markedPending) {
 +      return 'pending';
 +    }
 +
 +    if (
 +      this.result.failedExpectations.length > 0 ||
 +      (failSpecWithNoExpectations &&
 +        this.result.failedExpectations.length +
 +          this.result.passedExpectations.length ===
 +          0)
 +    ) {
 +      return 'failed';
 +    }
 +
 +    return 'passed';
 +  };
 +
 +  /**
 +   * The full description including all ancestors of this spec.
 +   * @name Spec#getFullName
 +   * @function
 +   * @returns {string}
 +   * @since 2.0.0
 +   */
 +  Spec.prototype.getFullName = function() {
 +    return this.getSpecName(this);
 +  };
 +
 +  Spec.prototype.addDeprecationWarning = function(deprecation) {
 +    if (typeof deprecation === 'string') {
 +      deprecation = { message: deprecation };
 +    }
 +    this.result.deprecationWarnings.push(
 +      this.expectationResultFactory(deprecation)
 +    );
 +  };
 +
 +  var extractCustomPendingMessage = function(e) {
 +    var fullMessage = e.toString(),
 +      boilerplateStart = fullMessage.indexOf(Spec.pendingSpecExceptionMessage),
 +      boilerplateEnd =
 +        boilerplateStart + Spec.pendingSpecExceptionMessage.length;
 +
 +    return fullMessage.substr(boilerplateEnd);
 +  };
 +
 +  Spec.pendingSpecExceptionMessage = '=> marked Pending';
 +
 +  Spec.isPendingSpecException = function(e) {
 +    return !!(
 +      e &&
 +      e.toString &&
 +      e.toString().indexOf(Spec.pendingSpecExceptionMessage) !== -1
 +    );
 +  };
 +
 +  return Spec;
 +};
 +
 +if (typeof window == void 0 && typeof exports == 'object') {
 +  /* globals exports */
 +  exports.Spec = jasmineRequire.Spec;
 +}
 +
 +/*jshint bitwise: false*/
 +
 +getJasmineRequireObj().Order = function() {
 +  function Order(options) {
 +    this.random = 'random' in options ? options.random : true;
 +    var seed = (this.seed = options.seed || generateSeed());
 +    this.sort = this.random ? randomOrder : naturalOrder;
 +
 +    function naturalOrder(items) {
 +      return items;
 +    }
 +
 +    function randomOrder(items) {
 +      var copy = items.slice();
 +      copy.sort(function(a, b) {
 +        return jenkinsHash(seed + a.id) - jenkinsHash(seed + b.id);
 +      });
 +      return copy;
 +    }
 +
 +    function generateSeed() {
 +      return String(Math.random()).slice(-5);
 +    }
 +
 +    // Bob Jenkins One-at-a-Time Hash algorithm is a non-cryptographic hash function
 +    // used to get a different output when the key changes slightly.
 +    // We use your return to sort the children randomly in a consistent way when
 +    // used in conjunction with a seed
 +
 +    function jenkinsHash(key) {
 +      var hash, i;
 +      for (hash = i = 0; i < key.length; ++i) {
 +        hash += key.charCodeAt(i);
 +        hash += hash << 10;
 +        hash ^= hash >> 6;
 +      }
 +      hash += hash << 3;
 +      hash ^= hash >> 11;
 +      hash += hash << 15;
 +      return hash;
 +    }
 +  }
 +
 +  return Order;
 +};
 +
 +getJasmineRequireObj().Env = function(j$) {
 +  /**
 +   * @class Env
 +   * @since 2.0.0
 +   * @classdesc The Jasmine environment.<br>
 +   * _Note:_ Do not construct this directly. You can obtain the Env instance by
 +   * calling {@link jasmine.getEnv}.
 +   * @hideconstructor
 +   */
 +  function Env(options) {
 +    options = options || {};
 +
 +    var self = this;
 +    var global = options.global || j$.getGlobal();
 +    var customPromise;
 +
 +    var totalSpecsDefined = 0;
 +
 +    var realSetTimeout = global.setTimeout;
 +    var realClearTimeout = global.clearTimeout;
 +    var clearStack = j$.getClearStack(global);
 +    this.clock = new j$.Clock(
 +      global,
 +      function() {
 +        return new j$.DelayedFunctionScheduler();
 +      },
 +      new j$.MockDate(global)
 +    );
 +
 +    var runnableResources = {};
 +
 +    var currentSpec = null;
 +    var currentlyExecutingSuites = [];
 +    var currentDeclarationSuite = null;
 +    var hasFailures = false;
 +
 +    /**
 +     * This represents the available options to configure Jasmine.
 +     * Options that are not provided will use their default values.
 +     * @see Env#configure
 +     * @interface Configuration
 +     * @since 3.3.0
 +     */
 +    var config = {
 +      /**
 +       * Whether to randomize spec execution order
 +       * @name Configuration#random
 +       * @since 3.3.0
 +       * @type Boolean
 +       * @default true
 +       */
 +      random: true,
 +      /**
 +       * Seed to use as the basis of randomization.
 +       * Null causes the seed to be determined randomly at the start of execution.
 +       * @name Configuration#seed
 +       * @since 3.3.0
 +       * @type (number|string)
 +       * @default null
 +       */
 +      seed: null,
 +      /**
 +       * Whether to stop execution of the suite after the first spec failure
 +       * @name Configuration#failFast
 +       * @since 3.3.0
 +       * @type Boolean
 +       * @default false
 +       * @deprecated Use the `stopOnSpecFailure` config property instead.
 +       */
 +      failFast: false,
 +      /**
 +       * Whether to stop execution of the suite after the first spec failure
 +       * @name Configuration#stopOnSpecFailure
 +       * @since 3.9.0
 +       * @type Boolean
 +       * @default false
 +       */
 +      stopOnSpecFailure: false,
 +      /**
 +       * Whether to fail the spec if it ran no expectations. By default
 +       * a spec that ran no expectations is reported as passed. Setting this
 +       * to true will report such spec as a failure.
 +       * @name Configuration#failSpecWithNoExpectations
 +       * @since 3.5.0
 +       * @type Boolean
 +       * @default false
 +       */
 +      failSpecWithNoExpectations: false,
 +      /**
 +       * Whether to cause specs to only have one expectation failure.
 +       * @name Configuration#oneFailurePerSpec
 +       * @since 3.3.0
 +       * @type Boolean
 +       * @default false
 +       * @deprecated Use the `stopSpecOnExpectationFailure` config property instead.
 +       */
 +      oneFailurePerSpec: false,
 +      /**
 +       * Whether to cause specs to only have one expectation failure.
 +       * @name Configuration#stopSpecOnExpectationFailure
 +       * @since 3.3.0
 +       * @type Boolean
 +       * @default false
 +       */
 +      stopSpecOnExpectationFailure: false,
 +      /**
 +       * A function that takes a spec and returns true if it should be executed
 +       * or false if it should be skipped.
 +       * @callback SpecFilter
 +       * @param {Spec} spec - The spec that the filter is being applied to.
 +       * @return boolean
 +       */
 +      /**
 +       * Function to use to filter specs
 +       * @name Configuration#specFilter
 +       * @since 3.3.0
 +       * @type SpecFilter
 +       * @default A function that always returns true.
 +       */
 +      specFilter: function() {
 +        return true;
 +      },
 +      /**
 +       * Whether or not reporters should hide disabled specs from their output.
 +       * Currently only supported by Jasmine's HTMLReporter
 +       * @name Configuration#hideDisabled
 +       * @since 3.3.0
 +       * @type Boolean
 +       * @default false
 +       */
 +      hideDisabled: false,
 +      /**
 +       * Set to provide a custom promise library that Jasmine will use if it needs
 +       * to create a promise. If not set, it will default to whatever global Promise
 +       * library is available (if any).
 +       * @name Configuration#Promise
 +       * @since 3.5.0
 +       * @type function
 +       * @default undefined
++       * @deprecated In a future version, Jasmine will ignore the Promise config
++       * property and always create native promises instead.
 +       */
 +      Promise: undefined,
 +      /**
 +       * Clean closures when a suite is done running (done by clearing the stored function reference).
 +       * This prevents memory leaks, but you won't be able to run jasmine multiple times.
 +       * @name Configuration#autoCleanClosures
 +       * @since 3.10.0
 +       * @type boolean
 +       * @default true
 +       */
-       autoCleanClosures: true
++      autoCleanClosures: true,
++      /**
++       * Whether or not to issue warnings for certain deprecated functionality
++       * every time it's used. If not set or set to false, deprecation warnings
++       * for methods that tend to be called frequently will be issued only once
++       * or otherwise throttled to to prevent the suite output from being flooded
++       * with warnings.
++       * @name Configuration#verboseDeprecations
++       * @since 3.6.0
++       * @type Boolean
++       * @default false
++       */
++      verboseDeprecations: false
 +    };
 +
 +    var currentSuite = function() {
 +      return currentlyExecutingSuites[currentlyExecutingSuites.length - 1];
 +    };
 +
 +    var currentRunnable = function() {
 +      return currentSpec || currentSuite();
 +    };
 +
 +    var globalErrors = null;
 +
 +    var installGlobalErrors = function() {
 +      if (globalErrors) {
 +        return;
 +      }
 +
 +      globalErrors = new j$.GlobalErrors();
 +      globalErrors.install();
 +    };
 +
 +    if (!options.suppressLoadErrors) {
 +      installGlobalErrors();
 +      globalErrors.pushListener(function(
 +        message,
 +        filename,
 +        lineno,
 +        colNo,
 +        err
 +      ) {
 +        topSuite.result.failedExpectations.push({
 +          passed: false,
 +          globalErrorType: 'load',
 +          message: message,
 +          stack: err && err.stack,
 +          filename: filename,
 +          lineno: lineno
 +        });
 +      });
 +    }
 +
 +    /**
 +     * Configure your jasmine environment
 +     * @name Env#configure
 +     * @since 3.3.0
 +     * @argument {Configuration} configuration
 +     * @function
 +     */
 +    this.configure = function(configuration) {
 +      var booleanProps = [
 +        'random',
 +        'failSpecWithNoExpectations',
 +        'hideDisabled',
 +        'autoCleanClosures'
 +      ];
 +
 +      booleanProps.forEach(function(prop) {
 +        if (typeof configuration[prop] !== 'undefined') {
 +          config[prop] = !!configuration[prop];
 +        }
 +      });
 +
 +      if (typeof configuration.failFast !== 'undefined') {
++        // We can't unconditionally issue a warning here because then users who
++        // get the configuration from Jasmine, modify it, and pass it back would
++        // see the warning.
++        if (configuration.failFast !== config.failFast) {
++          this.deprecated(
++            'The `failFast` config property is deprecated and will be removed ' +
++              'in a future version of Jasmine. Please use `stopOnSpecFailure` ' +
++              'instead.',
++            { ignoreRunnable: true }
++          );
++        }
++
 +        if (typeof configuration.stopOnSpecFailure !== 'undefined') {
 +          if (configuration.stopOnSpecFailure !== configuration.failFast) {
 +            throw new Error(
 +              'stopOnSpecFailure and failFast are aliases for ' +
 +                "each other. Don't set failFast if you also set stopOnSpecFailure."
 +            );
 +          }
 +        }
 +
 +        config.failFast = configuration.failFast;
 +        config.stopOnSpecFailure = configuration.failFast;
 +      } else if (typeof configuration.stopOnSpecFailure !== 'undefined') {
 +        config.failFast = configuration.stopOnSpecFailure;
 +        config.stopOnSpecFailure = configuration.stopOnSpecFailure;
 +      }
 +
 +      if (typeof configuration.oneFailurePerSpec !== 'undefined') {
++        // We can't unconditionally issue a warning here because then users who
++        // get the configuration from Jasmine, modify it, and pass it back would
++        // see the warning.
++        if (configuration.oneFailurePerSpec !== config.oneFailurePerSpec) {
++          this.deprecated(
++            'The `oneFailurePerSpec` config property is deprecated and will be ' +
++              'removed in a future version of Jasmine. Please use ' +
++              '`stopSpecOnExpectationFailure` instead.',
++            { ignoreRunnable: true }
++          );
++        }
++
 +        if (typeof configuration.stopSpecOnExpectationFailure !== 'undefined') {
 +          if (
 +            configuration.stopSpecOnExpectationFailure !==
 +            configuration.oneFailurePerSpec
 +          ) {
 +            throw new Error(
 +              'stopSpecOnExpectationFailure and oneFailurePerSpec are aliases for ' +
 +                "each other. Don't set oneFailurePerSpec if you also set stopSpecOnExpectationFailure."
 +            );
 +          }
 +        }
 +
 +        config.oneFailurePerSpec = configuration.oneFailurePerSpec;
 +        config.stopSpecOnExpectationFailure = configuration.oneFailurePerSpec;
 +      } else if (
 +        typeof configuration.stopSpecOnExpectationFailure !== 'undefined'
 +      ) {
 +        config.oneFailurePerSpec = configuration.stopSpecOnExpectationFailure;
 +        config.stopSpecOnExpectationFailure =
 +          configuration.stopSpecOnExpectationFailure;
 +      }
 +
 +      if (configuration.specFilter) {
 +        config.specFilter = configuration.specFilter;
 +      }
 +
 +      if (typeof configuration.seed !== 'undefined') {
 +        config.seed = configuration.seed;
 +      }
 +
 +      // Don't use hasOwnProperty to check for Promise existence because Promise
 +      // can be initialized to undefined, either explicitly or by using the
 +      // object returned from Env#configuration. In particular, Karma does this.
 +      if (configuration.Promise) {
 +        if (
 +          typeof configuration.Promise.resolve === 'function' &&
 +          typeof configuration.Promise.reject === 'function'
 +        ) {
 +          customPromise = configuration.Promise;
++          self.deprecated(
++            'The `Promise` config property is deprecated. Future versions ' +
++              'of Jasmine will create native promises even if the `Promise` ' +
++              'config property is set. Please remove it.'
++          );
 +        } else {
 +          throw new Error(
 +            'Custom promise library missing `resolve`/`reject` functions'
 +          );
 +        }
 +      }
++
++      if (configuration.hasOwnProperty('verboseDeprecations')) {
++        config.verboseDeprecations = configuration.verboseDeprecations;
++        deprecator.verboseDeprecations(config.verboseDeprecations);
++      }
 +    };
 +
 +    /**
 +     * Get the current configuration for your jasmine environment
 +     * @name Env#configuration
 +     * @since 3.3.0
 +     * @function
 +     * @returns {Configuration}
 +     */
 +    this.configuration = function() {
 +      var result = {};
 +      for (var property in config) {
 +        result[property] = config[property];
 +      }
 +      return result;
 +    };
 +
 +    Object.defineProperty(this, 'specFilter', {
 +      get: function() {
 +        self.deprecated(
-           'Getting specFilter directly from Env is deprecated and will be removed in a future version of Jasmine, please check the specFilter option from `configuration`'
++          'Getting specFilter directly from Env is deprecated and will be ' +
++            'removed in a future version of Jasmine. Please check the ' +
++            'specFilter option from `configuration` instead.',
++          { ignoreRunnable: true }
 +        );
 +        return config.specFilter;
 +      },
 +      set: function(val) {
 +        self.deprecated(
-           'Setting specFilter directly on Env is deprecated and will be removed in a future version of Jasmine, please use the specFilter option in `configure`'
++          'Setting specFilter directly on Env is deprecated and will be ' +
++            'removed in a future version of Jasmine. Please use the ' +
++            'specFilter option in `configure` instead.',
++          { ignoreRunnable: true }
 +        );
 +        config.specFilter = val;
 +      }
 +    });
 +
 +    this.setDefaultSpyStrategy = function(defaultStrategyFn) {
 +      if (!currentRunnable()) {
 +        throw new Error(
 +          'Default spy strategy must be set in a before function or a spec'
 +        );
 +      }
 +      runnableResources[
 +        currentRunnable().id
 +      ].defaultStrategyFn = defaultStrategyFn;
 +    };
 +
 +    this.addSpyStrategy = function(name, fn) {
 +      if (!currentRunnable()) {
 +        throw new Error(
 +          'Custom spy strategies must be added in a before function or a spec'
 +        );
 +      }
 +      runnableResources[currentRunnable().id].customSpyStrategies[name] = fn;
 +    };
 +
 +    this.addCustomEqualityTester = function(tester) {
 +      if (!currentRunnable()) {
 +        throw new Error(
 +          'Custom Equalities must be added in a before function or a spec'
 +        );
 +      }
 +      runnableResources[currentRunnable().id].customEqualityTesters.push(
 +        tester
 +      );
 +    };
 +
 +    this.addMatchers = function(matchersToAdd) {
 +      if (!currentRunnable()) {
 +        throw new Error(
 +          'Matchers must be added in a before function or a spec'
 +        );
 +      }
 +      var customMatchers =
 +        runnableResources[currentRunnable().id].customMatchers;
 +
 +      for (var matcherName in matchersToAdd) {
++        if (matchersToAdd[matcherName].length > 1) {
++          self.deprecated(
++            'The matcher factory for "' +
++              matcherName +
++              '" ' +
++              'accepts custom equality testers, but this parameter will no longer be ' +
++              'passed in a future release. ' +
++              'See <https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#matchers-cet> for details.'
++          );
++        }
++
 +        customMatchers[matcherName] = matchersToAdd[matcherName];
 +      }
 +    };
 +
 +    this.addAsyncMatchers = function(matchersToAdd) {
 +      if (!currentRunnable()) {
 +        throw new Error(
 +          'Async Matchers must be added in a before function or a spec'
 +        );
 +      }
 +      var customAsyncMatchers =
 +        runnableResources[currentRunnable().id].customAsyncMatchers;
 +
 +      for (var matcherName in matchersToAdd) {
++        if (matchersToAdd[matcherName].length > 1) {
++          self.deprecated(
++            'The matcher factory for "' +
++              matcherName +
++              '" ' +
++              'accepts custom equality testers, but this parameter will no longer be ' +
++              'passed in a future release. ' +
++              'See <https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#matchers-cet> for details.'
++          );
++        }
++
 +        customAsyncMatchers[matcherName] = matchersToAdd[matcherName];
 +      }
 +    };
 +
 +    this.addCustomObjectFormatter = function(formatter) {
 +      if (!currentRunnable()) {
 +        throw new Error(
 +          'Custom object formatters must be added in a before function or a spec'
 +        );
 +      }
 +
 +      runnableResources[currentRunnable().id].customObjectFormatters.push(
 +        formatter
 +      );
 +    };
 +
 +    j$.Expectation.addCoreMatchers(j$.matchers);
 +    j$.Expectation.addAsyncCoreMatchers(j$.asyncMatchers);
 +
 +    var nextSpecId = 0;
 +    var getNextSpecId = function() {
 +      return 'spec' + nextSpecId++;
 +    };
 +
 +    var nextSuiteId = 0;
 +    var getNextSuiteId = function() {
 +      return 'suite' + nextSuiteId++;
 +    };
 +
 +    var makePrettyPrinter = function() {
 +      var customObjectFormatters =
 +        runnableResources[currentRunnable().id].customObjectFormatters;
 +      return j$.makePrettyPrinter(customObjectFormatters);
 +    };
 +
 +    var makeMatchersUtil = function() {
 +      var customEqualityTesters =
 +        runnableResources[currentRunnable().id].customEqualityTesters;
 +      return new j$.MatchersUtil({
 +        customTesters: customEqualityTesters,
 +        pp: makePrettyPrinter()
 +      });
 +    };
 +
 +    var expectationFactory = function(actual, spec) {
 +      var customEqualityTesters =
 +        runnableResources[spec.id].customEqualityTesters;
 +
 +      return j$.Expectation.factory({
 +        matchersUtil: makeMatchersUtil(),
 +        customEqualityTesters: customEqualityTesters,
 +        customMatchers: runnableResources[spec.id].customMatchers,
 +        actual: actual,
 +        addExpectationResult: addExpectationResult
 +      });
 +
 +      function addExpectationResult(passed, result) {
 +        return spec.addExpectationResult(passed, result);
 +      }
 +    };
 +
 +    function recordLateExpectation(runable, runableType, result) {
 +      var delayedExpectationResult = {};
 +      Object.keys(result).forEach(function(k) {
 +        delayedExpectationResult[k] = result[k];
 +      });
 +      delayedExpectationResult.passed = false;
 +      delayedExpectationResult.globalErrorType = 'lateExpectation';
 +      delayedExpectationResult.message =
 +        runableType +
 +        ' "' +
 +        runable.getFullName() +
 +        '" ran a "' +
 +        result.matcherName +
 +        '" expectation after it finished.\n';
 +
 +      if (result.message) {
 +        delayedExpectationResult.message +=
 +          'Message: "' + result.message + '"\n';
 +      }
 +
 +      delayedExpectationResult.message +=
 +        '1. Did you forget to return or await the result of expectAsync?\n' +
 +        '2. Was done() invoked before an async operation completed?\n' +
 +        '3. Did an expectation follow a call to done()?';
 +
 +      topSuite.result.failedExpectations.push(delayedExpectationResult);
 +    }
 +
 +    var asyncExpectationFactory = function(actual, spec, runableType) {
 +      return j$.Expectation.asyncFactory({
 +        matchersUtil: makeMatchersUtil(),
 +        customEqualityTesters: runnableResources[spec.id].customEqualityTesters,
 +        customAsyncMatchers: runnableResources[spec.id].customAsyncMatchers,
 +        actual: actual,
 +        addExpectationResult: addExpectationResult
 +      });
 +
 +      function addExpectationResult(passed, result) {
 +        if (currentRunnable() !== spec) {
 +          recordLateExpectation(spec, runableType, result);
 +        }
 +        return spec.addExpectationResult(passed, result);
 +      }
 +    };
 +    var suiteAsyncExpectationFactory = function(actual, suite) {
 +      return asyncExpectationFactory(actual, suite, 'Suite');
 +    };
 +
 +    var specAsyncExpectationFactory = function(actual, suite) {
 +      return asyncExpectationFactory(actual, suite, 'Spec');
 +    };
 +
 +    var defaultResourcesForRunnable = function(id, parentRunnableId) {
 +      var resources = {
 +        spies: [],
 +        customEqualityTesters: [],
 +        customMatchers: {},
 +        customAsyncMatchers: {},
 +        customSpyStrategies: {},
 +        defaultStrategyFn: undefined,
 +        customObjectFormatters: []
 +      };
 +
 +      if (runnableResources[parentRunnableId]) {
 +        resources.customEqualityTesters = j$.util.clone(
 +          runnableResources[parentRunnableId].customEqualityTesters
 +        );
 +        resources.customMatchers = j$.util.clone(
 +          runnableResources[parentRunnableId].customMatchers
 +        );
 +        resources.customAsyncMatchers = j$.util.clone(
 +          runnableResources[parentRunnableId].customAsyncMatchers
 +        );
 +        resources.customObjectFormatters = j$.util.clone(
 +          runnableResources[parentRunnableId].customObjectFormatters
 +        );
 +        resources.defaultStrategyFn =
 +          runnableResources[parentRunnableId].defaultStrategyFn;
 +      }
 +
 +      runnableResources[id] = resources;
 +    };
 +
 +    var clearResourcesForRunnable = function(id) {
 +      spyRegistry.clearSpies();
 +      delete runnableResources[id];
 +    };
 +
 +    var beforeAndAfterFns = function(targetSuite) {
 +      return function() {
 +        var befores = [],
 +          afters = [],
 +          suite = targetSuite;
 +
 +        while (suite) {
 +          befores = befores.concat(suite.beforeFns);
 +          afters = afters.concat(suite.afterFns);
 +
 +          suite = suite.parentSuite;
 +        }
 +
 +        return {
 +          befores: befores.reverse(),
 +          afters: afters
 +        };
 +      };
 +    };
 +
 +    var getSpecName = function(spec, suite) {
 +      var fullName = [spec.description],
 +        suiteFullName = suite.getFullName();
 +
 +      if (suiteFullName !== '') {
 +        fullName.unshift(suiteFullName);
 +      }
 +      return fullName.join(' ');
 +    };
 +
 +    // TODO: we may just be able to pass in the fn instead of wrapping here
 +    var buildExpectationResult = j$.buildExpectationResult,
 +      exceptionFormatter = new j$.ExceptionFormatter(),
 +      expectationResultFactory = function(attrs) {
 +        attrs.messageFormatter = exceptionFormatter.message;
 +        attrs.stackFormatter = exceptionFormatter.stack;
 +
 +        return buildExpectationResult(attrs);
 +      };
 +
 +    /**
 +     * Sets whether Jasmine should throw an Error when an expectation fails.
 +     * This causes a spec to only have one expectation failure.
 +     * @name Env#throwOnExpectationFailure
 +     * @since 2.3.0
 +     * @function
 +     * @param {Boolean} value Whether to throw when a expectation fails
 +     * @deprecated Use the `stopSpecOnExpectationFailure` option with {@link Env#configure}
 +     */
 +    this.throwOnExpectationFailure = function(value) {
 +      this.deprecated(
 +        'Setting throwOnExpectationFailure directly on Env is deprecated and ' +
 +          'will be removed in a future version of Jasmine. Please use the ' +
-           'stopSpecOnExpectationFailure option in `configure`.'
++          'stopSpecOnExpectationFailure option in `configure`.',
++        { ignoreRunnable: true }
 +      );
 +      this.configure({ oneFailurePerSpec: !!value });
 +    };
 +
 +    this.throwingExpectationFailures = function() {
 +      this.deprecated(
 +        'Getting throwingExpectationFailures directly from Env is deprecated ' +
 +          'and will be removed in a future version of Jasmine. Please check ' +
-           'the stopSpecOnExpectationFailure option from `configuration`.'
++          'the stopSpecOnExpectationFailure option from `configuration`.',
++        { ignoreRunnable: true }
 +      );
 +      return config.oneFailurePerSpec;
 +    };
 +
 +    /**
 +     * Set whether to stop suite execution when a spec fails
 +     * @name Env#stopOnSpecFailure
 +     * @since 2.7.0
 +     * @function
 +     * @param {Boolean} value Whether to stop suite execution when a spec fails
 +     * @deprecated Use the `stopOnSpecFailure` option with {@link Env#configure}
 +     */
 +    this.stopOnSpecFailure = function(value) {
 +      this.deprecated(
 +        'Setting stopOnSpecFailure directly is deprecated and will be ' +
 +          'removed in a future version of Jasmine. Please use the ' +
-           'stopOnSpecFailure option in `configure`.'
++          'stopOnSpecFailure option in `configure`.',
++        { ignoreRunnable: true }
 +      );
 +      this.configure({ stopOnSpecFailure: !!value });
 +    };
 +
 +    this.stoppingOnSpecFailure = function() {
 +      this.deprecated(
 +        'Getting stoppingOnSpecFailure directly from Env is deprecated and ' +
 +          'will be removed in a future version of Jasmine. Please check the ' +
-           'stopOnSpecFailure option from `configuration`.'
++          'stopOnSpecFailure option from `configuration`.',
++        { ignoreRunnable: true }
 +      );
 +      return config.failFast;
 +    };
 +
 +    /**
 +     * Set whether to randomize test execution order
 +     * @name Env#randomizeTests
 +     * @since 2.4.0
 +     * @function
 +     * @param {Boolean} value Whether to randomize execution order
 +     * @deprecated Use the `random` option with {@link Env#configure}
 +     */
 +    this.randomizeTests = function(value) {
 +      this.deprecated(
-         'Setting randomizeTests directly is deprecated and will be removed in a future version of Jasmine, please use the random option in `configure`'
++        'Setting randomizeTests directly is deprecated and will be removed ' +
++          'in a future version of Jasmine. Please use the random option in ' +
++          '`configure` instead.',
++        { ignoreRunnable: true }
 +      );
 +      config.random = !!value;
 +    };
 +
 +    this.randomTests = function() {
 +      this.deprecated(
-         'Getting randomTests directly from Env is deprecated and will be removed in a future version of Jasmine, please check the random option from `configuration`'
++        'Getting randomTests directly from Env is deprecated and will be ' +
++          'removed in a future version of Jasmine. Please check the random ' +
++          'option from `configuration` instead.',
++        { ignoreRunnable: true }
 +      );
 +      return config.random;
 +    };
 +
 +    /**
 +     * Set the random number seed for spec randomization
 +     * @name Env#seed
 +     * @since 2.4.0
 +     * @function
 +     * @param {Number} value The seed value
 +     * @deprecated Use the `seed` option with {@link Env#configure}
 +     */
 +    this.seed = function(value) {
 +      this.deprecated(
-         'Setting seed directly is deprecated and will be removed in a future version of Jasmine, please use the seed option in `configure`'
++        'Setting seed directly is deprecated and will be removed in a ' +
++          'future version of Jasmine. Please use the seed option in ' +
++          '`configure` instead.',
++        { ignoreRunnable: true }
 +      );
 +      if (value) {
 +        config.seed = value;
 +      }
 +      return config.seed;
 +    };
 +
 +    this.hidingDisabled = function(value) {
 +      this.deprecated(
-         'Getting hidingDisabled directly from Env is deprecated and will be removed in a future version of Jasmine, please check the hideDisabled option from `configuration`'
++        'Getting hidingDisabled directly from Env is deprecated and will ' +
++          'be removed in a future version of Jasmine. Please check the ' +
++          'hideDisabled option from `configuration` instead.',
++        { ignoreRunnable: true }
 +      );
 +      return config.hideDisabled;
 +    };
 +
 +    /**
 +     * @name Env#hideDisabled
 +     * @since 3.2.0
 +     * @function
 +     * @deprecated Use the `hideDisabled` option with {@link Env#configure}
 +     */
 +    this.hideDisabled = function(value) {
 +      this.deprecated(
-         'Setting hideDisabled directly is deprecated and will be removed in a future version of Jasmine, please use the hideDisabled option in `configure`'
++        'Setting hideDisabled directly is deprecated and will be removed ' +
++          'in a future version of Jasmine. Please use the hideDisabled option ' +
++          'in `configure` instead.',
++        { ignoreRunnable: true }
 +      );
 +      config.hideDisabled = !!value;
 +    };
 +
-     this.deprecated = function(deprecation) {
++    /**
++     * Causes a deprecation warning to be logged to the console and reported to
++     * reporters.
++     *
++     * The optional second parameter is an object that can have either of the
++     * following properties:
++     *
++     * omitStackTrace: Whether to omit the stack trace. Optional. Defaults to
++     * false. This option is ignored if the deprecation is an Error. Set this
++     * when the stack trace will not contain anything that helps the user find
++     * the source of the deprecation.
++     *
++     * ignoreRunnable: Whether to log the deprecation on the root suite, ignoring
++     * the spec or suite that's running when it happens. Optional. Defaults to
++     * false.
++     *
++     * @name Env#deprecated
++     * @since 2.99
++     * @function
++     * @param {String|Error} deprecation The deprecation message
++     * @param {Object} [options] Optional extra options, as described above
++     */
++    this.deprecated = function(deprecation, options) {
 +      var runnable = currentRunnable() || topSuite;
-       var context;
- 
-       if (runnable === topSuite) {
-         context = '';
-       } else if (runnable === currentSuite()) {
-         context = ' (in suite: ' + runnable.getFullName() + ')';
-       } else {
-         context = ' (in spec: ' + runnable.getFullName() + ')';
-       }
- 
-       runnable.addDeprecationWarning(deprecation);
-       if (
-         typeof console !== 'undefined' &&
-         typeof console.error === 'function'
-       ) {
-         console.error('DEPRECATION: ' + deprecation + context);
-       }
++      deprecator.addDeprecationWarning(runnable, deprecation, options);
 +    };
 +
 +    var queueRunnerFactory = function(options, args) {
 +      var failFast = false;
 +      if (options.isLeaf) {
 +        failFast = config.stopSpecOnExpectationFailure;
 +      } else if (!options.isReporter) {
 +        failFast = config.stopOnSpecFailure;
 +      }
 +      options.clearStack = options.clearStack || clearStack;
 +      options.timeout = {
 +        setTimeout: realSetTimeout,
 +        clearTimeout: realClearTimeout
 +      };
 +      options.fail = self.fail;
 +      options.globalErrors = globalErrors;
 +      options.completeOnFirstError = failFast;
 +      options.onException =
 +        options.onException ||
 +        function(e) {
 +          (currentRunnable() || topSuite).onException(e);
 +        };
 +      options.deprecated = self.deprecated;
 +
 +      new j$.QueueRunner(options).execute(args);
 +    };
 +
 +    var topSuite = new j$.Suite({
 +      env: this,
 +      id: getNextSuiteId(),
 +      description: 'Jasmine__TopLevel__Suite',
 +      expectationFactory: expectationFactory,
 +      asyncExpectationFactory: suiteAsyncExpectationFactory,
 +      expectationResultFactory: expectationResultFactory,
 +      autoCleanClosures: config.autoCleanClosures
 +    });
++    var deprecator = new j$.Deprecator(topSuite);
 +    currentDeclarationSuite = topSuite;
 +
 +    /**
 +     * Provides the root suite, through which all suites and specs can be
 +     * accessed.
 +     * @function
 +     * @name Env#topSuite
 +     * @return {Suite} the root suite
 +     * @since 2.0.0
 +     */
 +    this.topSuite = function() {
-       return topSuite;
++      return j$.deprecatingSuiteProxy(topSuite, null, this);
 +    };
 +
 +    /**
 +     * This represents the available reporter callback for an object passed to {@link Env#addReporter}.
 +     * @interface Reporter
 +     * @see custom_reporter
 +     */
 +    var reporter = new j$.ReportDispatcher(
 +      [
 +        /**
 +         * `jasmineStarted` is called after all of the specs have been loaded, but just before execution starts.
 +         * @function
 +         * @name Reporter#jasmineStarted
 +         * @param {JasmineStartedInfo} suiteInfo Information about the full Jasmine suite that is being run
 +         * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
 +         * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
 +         * @see async
 +         */
 +        'jasmineStarted',
 +        /**
 +         * When the entire suite has finished execution `jasmineDone` is called
 +         * @function
 +         * @name Reporter#jasmineDone
 +         * @param {JasmineDoneInfo} suiteInfo Information about the full Jasmine suite that just finished running.
 +         * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
 +         * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
 +         * @see async
 +         */
 +        'jasmineDone',
 +        /**
 +         * `suiteStarted` is invoked when a `describe` starts to run
 +         * @function
 +         * @name Reporter#suiteStarted
 +         * @param {SuiteResult} result Information about the individual {@link describe} being run
 +         * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
 +         * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
 +         * @see async
 +         */
 +        'suiteStarted',
 +        /**
 +         * `suiteDone` is invoked when all of the child specs and suites for a given suite have been run
 +         *
 +         * While jasmine doesn't require any specific functions, not defining a `suiteDone` will make it impossible for a reporter to know when a suite has failures in an `afterAll`.
 +         * @function
 +         * @name Reporter#suiteDone
 +         * @param {SuiteResult} result
 +         * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
 +         * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
 +         * @see async
 +         */
 +        'suiteDone',
 +        /**
 +         * `specStarted` is invoked when an `it` starts to run (including associated `beforeEach` functions)
 +         * @function
 +         * @name Reporter#specStarted
 +         * @param {SpecResult} result Information about the individual {@link it} being run
 +         * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
 +         * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
 +         * @see async
 +         */
 +        'specStarted',
 +        /**
 +         * `specDone` is invoked when an `it` and its associated `beforeEach` and `afterEach` functions have been run.
 +         *
 +         * While jasmine doesn't require any specific functions, not defining a `specDone` will make it impossible for a reporter to know when a spec has failed.
 +         * @function
 +         * @name Reporter#specDone
 +         * @param {SpecResult} result
 +         * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
 +         * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
 +         * @see async
 +         */
 +        'specDone'
 +      ],
-       queueRunnerFactory
++      queueRunnerFactory,
++      self.deprecated
 +    );
 +
 +    /**
 +     * Executes the specs.
 +     *
 +     * If called with no parameters or with a falsy value as the first parameter,
 +     * all specs will be executed except those that are excluded by a
 +     * [spec filter]{@link Configuration#specFilter} or other mechanism. If the
 +     * first parameter is a list of spec/suite IDs, only those specs/suites will
 +     * be run.
 +     *
 +     * Both parameters are optional, but a completion callback is only valid as
 +     * the second parameter. To specify a completion callback but not a list of
 +     * specs/suites to run, pass null or undefined as the first parameter.
 +     *
 +     * execute should not be called more than once.
 +     *
 +     * If the environment supports promises, execute will return a promise that
 +     * is resolved after the suite finishes executing. The promise will be
 +     * resolved (not rejected) as long as the suite runs to completion. Use a
 +     * {@link Reporter} to determine whether or not the suite passed.
 +     *
 +     * @name Env#execute
 +     * @since 2.0.0
 +     * @function
 +     * @param {(string[])=} runnablesToRun IDs of suites and/or specs to run
 +     * @param {Function=} onComplete Function that will be called after all specs have run
 +     * @return {Promise<undefined>}
 +     */
 +    this.execute = function(runnablesToRun, onComplete) {
 +      if (this._executedBefore) {
 +        topSuite.reset();
 +      }
 +      this._executedBefore = true;
 +      defaultResourcesForRunnable(topSuite.id);
 +      installGlobalErrors();
 +
 +      if (!runnablesToRun) {
 +        if (focusedRunnables.length) {
 +          runnablesToRun = focusedRunnables;
 +        } else {
 +          runnablesToRun = [topSuite.id];
 +        }
 +      }
 +
 +      var order = new j$.Order({
 +        random: config.random,
 +        seed: config.seed
 +      });
 +
 +      var processor = new j$.TreeProcessor({
 +        tree: topSuite,
 +        runnableIds: runnablesToRun,
 +        queueRunnerFactory: queueRunnerFactory,
 +        failSpecWithNoExpectations: config.failSpecWithNoExpectations,
 +        nodeStart: function(suite, next) {
 +          currentlyExecutingSuites.push(suite);
 +          defaultResourcesForRunnable(suite.id, suite.parentSuite.id);
 +          reporter.suiteStarted(suite.result, next);
 +          suite.startTimer();
 +        },
 +        nodeComplete: function(suite, result, next) {
 +          if (suite !== currentSuite()) {
 +            throw new Error('Tried to complete the wrong suite');
 +          }
 +
 +          clearResourcesForRunnable(suite.id);
 +          currentlyExecutingSuites.pop();
 +
 +          if (result.status === 'failed') {
 +            hasFailures = true;
 +          }
 +          suite.endTimer();
 +          reporter.suiteDone(result, next);
 +        },
 +        orderChildren: function(node) {
 +          return order.sort(node.children);
 +        },
 +        excludeNode: function(spec) {
 +          return !config.specFilter(spec);
 +        }
 +      });
 +
 +      if (!processor.processTree().valid) {
 +        throw new Error(
 +          'Invalid order: would cause a beforeAll or afterAll to be run multiple times'
 +        );
 +      }
 +
 +      var jasmineTimer = new j$.Timer();
 +      jasmineTimer.start();
 +
 +      var Promise = customPromise || global.Promise;
 +
 +      if (Promise) {
 +        return new Promise(function(resolve) {
 +          runAll(function() {
 +            if (onComplete) {
 +              onComplete();
 +            }
 +
 +            resolve();
 +          });
 +        });
 +      } else {
 +        runAll(function() {
 +          if (onComplete) {
 +            onComplete();
 +          }
 +        });
 +      }
 +
 +      function runAll(done) {
 +        /**
 +         * Information passed to the {@link Reporter#jasmineStarted} event.
 +         * @typedef JasmineStartedInfo
 +         * @property {Int} totalSpecsDefined - The total number of specs defined in this suite.
 +         * @property {Order} order - Information about the ordering (random or not) of this execution of the suite.
 +         * @since 2.0.0
 +         */
 +        reporter.jasmineStarted(
 +          {
 +            totalSpecsDefined: totalSpecsDefined,
 +            order: order
 +          },
 +          function() {
 +            currentlyExecutingSuites.push(topSuite);
 +
 +            processor.execute(function() {
 +              clearResourcesForRunnable(topSuite.id);
 +              currentlyExecutingSuites.pop();
 +              var overallStatus, incompleteReason;
 +
 +              if (
 +                hasFailures ||
 +                topSuite.result.failedExpectations.length > 0
 +              ) {
 +                overallStatus = 'failed';
 +              } else if (focusedRunnables.length > 0) {
 +                overallStatus = 'incomplete';
 +                incompleteReason = 'fit() or fdescribe() was found';
 +              } else if (totalSpecsDefined === 0) {
 +                overallStatus = 'incomplete';
 +                incompleteReason = 'No specs found';
 +              } else {
 +                overallStatus = 'passed';
 +              }
 +
 +              /**
 +               * Information passed to the {@link Reporter#jasmineDone} event.
 +               * @typedef JasmineDoneInfo
 +               * @property {OverallStatus} overallStatus - The overall result of the suite: 'passed', 'failed', or 'incomplete'.
 +               * @property {Int} totalTime - The total time (in ms) that it took to execute the suite
 +               * @property {IncompleteReason} incompleteReason - Explanation of why the suite was incomplete.
 +               * @property {Order} order - Information about the ordering (random or not) of this execution of the suite.
 +               * @property {Expectation[]} failedExpectations - List of expectations that failed in an {@link afterAll} at the global level.
 +               * @property {Expectation[]} deprecationWarnings - List of deprecation warnings that occurred at the global level.
 +               * @since 2.4.0
 +               */
 +              reporter.jasmineDone(
 +                {
 +                  overallStatus: overallStatus,
 +                  totalTime: jasmineTimer.elapsed(),
 +                  incompleteReason: incompleteReason,
 +                  order: order,
 +                  failedExpectations: topSuite.result.failedExpectations,
 +                  deprecationWarnings: topSuite.result.deprecationWarnings
 +                },
 +                done
 +              );
 +            });
 +          }
 +        );
 +      }
 +    };
 +
 +    /**
 +     * Add a custom reporter to the Jasmine environment.
 +     * @name Env#addReporter
 +     * @since 2.0.0
 +     * @function
 +     * @param {Reporter} reporterToAdd The reporter to be added.
 +     * @see custom_reporter
 +     */
 +    this.addReporter = function(reporterToAdd) {
 +      reporter.addReporter(reporterToAdd);
 +    };
 +
 +    /**
 +     * Provide a fallback reporter if no other reporters have been specified.
 +     * @name Env#provideFallbackReporter
 +     * @since 2.5.0
 +     * @function
 +     * @param {Reporter} reporterToAdd The reporter
 +     * @see custom_reporter
 +     */
 +    this.provideFallbackReporter = function(reporterToAdd) {
 +      reporter.provideFallbackReporter(reporterToAdd);
 +    };
 +
 +    /**
 +     * Clear all registered reporters
 +     * @name Env#clearReporters
 +     * @since 2.5.2
 +     * @function
 +     */
 +    this.clearReporters = function() {
 +      reporter.clearReporters();
 +    };
 +
 +    var spyFactory = new j$.SpyFactory(
 +      function getCustomStrategies() {
 +        var runnable = currentRunnable();
 +
 +        if (runnable) {
 +          return runnableResources[runnable.id].customSpyStrategies;
 +        }
 +
 +        return {};
 +      },
 +      function getDefaultStrategyFn() {
 +        var runnable = currentRunnable();
 +
 +        if (runnable) {
 +          return runnableResources[runnable.id].defaultStrategyFn;
 +        }
 +
 +        return undefined;
 +      },
 +      function getPromise() {
 +        return customPromise || global.Promise;
 +      }
 +    );
 +
 +    var spyRegistry = new j$.SpyRegistry({
 +      currentSpies: function() {
 +        if (!currentRunnable()) {
 +          throw new Error(
 +            'Spies must be created in a before function or a spec'
 +          );
 +        }
 +        return runnableResources[currentRunnable().id].spies;
 +      },
 +      createSpy: function(name, originalFn) {
 +        return self.createSpy(name, originalFn);
 +      }
 +    });
 +
 +    /**
 +     * Configures whether Jasmine should allow the same function to be spied on
 +     * more than once during the execution of a spec. By default, spying on
 +     * a function that is already a spy will cause an error.
 +     * @name Env#allowRespy
 +     * @function
 +     * @since 2.5.0
 +     * @param {boolean} allow Whether to allow respying
 +     */
 +    this.allowRespy = function(allow) {
 +      spyRegistry.allowRespy(allow);
 +    };
 +
 +    this.spyOn = function() {
 +      return spyRegistry.spyOn.apply(spyRegistry, arguments);
 +    };
 +
 +    this.spyOnProperty = function() {
 +      return spyRegistry.spyOnProperty.apply(spyRegistry, arguments);
 +    };
 +
 +    this.spyOnAllFunctions = function() {
 +      return spyRegistry.spyOnAllFunctions.apply(spyRegistry, arguments);
 +    };
 +
 +    this.createSpy = function(name, originalFn) {
 +      if (arguments.length === 1 && j$.isFunction_(name)) {
 +        originalFn = name;
 +        name = originalFn.name;
 +      }
 +
 +      return spyFactory.createSpy(name, originalFn);
 +    };
 +
 +    this.createSpyObj = function(baseName, methodNames, propertyNames) {
 +      return spyFactory.createSpyObj(baseName, methodNames, propertyNames);
 +    };
 +
 +    var ensureIsFunction = function(fn, caller) {
 +      if (!j$.isFunction_(fn)) {
 +        throw new Error(
 +          caller + ' expects a function argument; received ' + j$.getType_(fn)
 +        );
 +      }
 +    };
 +
 +    var ensureIsFunctionOrAsync = function(fn, caller) {
 +      if (!j$.isFunction_(fn) && !j$.isAsyncFunction_(fn)) {
 +        throw new Error(
 +          caller + ' expects a function argument; received ' + j$.getType_(fn)
 +        );
 +      }
 +    };
 +
 +    function ensureIsNotNested(method) {
 +      var runnable = currentRunnable();
 +      if (runnable !== null && runnable !== undefined) {
 +        throw new Error(
 +          "'" + method + "' should only be used in 'describe' function"
 +        );
 +      }
 +    }
 +
 +    var suiteFactory = function(description) {
 +      var suite = new j$.Suite({
 +        env: self,
 +        id: getNextSuiteId(),
 +        description: description,
 +        parentSuite: currentDeclarationSuite,
 +        timer: new j$.Timer(),
 +        expectationFactory: expectationFactory,
 +        asyncExpectationFactory: suiteAsyncExpectationFactory,
 +        expectationResultFactory: expectationResultFactory,
 +        throwOnExpectationFailure: config.oneFailurePerSpec,
 +        autoCleanClosures: config.autoCleanClosures
 +      });
 +
 +      return suite;
 +    };
 +
 +    this.describe = function(description, specDefinitions) {
-       //ensureIsNotNested('describe');
++      ensureIsNotNested('describe');
 +      ensureIsFunction(specDefinitions, 'describe');
 +      var suite = suiteFactory(description);
 +      if (specDefinitions.length > 0) {
 +        throw new Error('describe does not expect any arguments');
 +      }
 +      if (currentDeclarationSuite.markedExcluding) {
 +        suite.exclude();
 +      }
 +      addSpecsToSuite(suite, specDefinitions);
-       return suite;
++      if (suite.parentSuite && !suite.children.length) {
++        this.deprecated(
++          'describe with no children (describe() or it()) is ' +
++            'deprecated and will be removed in a future version of Jasmine. ' +
++            'Please either remove the describe or add children to it.'
++        );
++      }
++      return j$.deprecatingSuiteProxy(suite, suite.parentSuite, this);
 +    };
 +
 +    this.xdescribe = function(description, specDefinitions) {
 +      ensureIsNotNested('xdescribe');
 +      ensureIsFunction(specDefinitions, 'xdescribe');
 +      var suite = suiteFactory(description);
 +      suite.exclude();
 +      addSpecsToSuite(suite, specDefinitions);
-       return suite;
++      return j$.deprecatingSuiteProxy(suite, suite.parentSuite, this);
 +    };
 +
 +    var focusedRunnables = [];
 +
 +    this.fdescribe = function(description, specDefinitions) {
 +      ensureIsNotNested('fdescribe');
 +      ensureIsFunction(specDefinitions, 'fdescribe');
 +      var suite = suiteFactory(description);
 +      suite.isFocused = true;
 +
 +      focusedRunnables.push(suite.id);
 +      unfocusAncestor();
 +      addSpecsToSuite(suite, specDefinitions);
 +
-       return suite;
++      return j$.deprecatingSuiteProxy(suite, suite.parentSuite, this);
 +    };
 +
 +    function addSpecsToSuite(suite, specDefinitions) {
 +      var parentSuite = currentDeclarationSuite;
 +      parentSuite.addChild(suite);
 +      currentDeclarationSuite = suite;
 +
 +      var declarationError = null;
 +      try {
-         specDefinitions.call(suite);
++        specDefinitions.call(j$.deprecatingThisProxy(suite, self));
 +      } catch (e) {
 +        declarationError = e;
 +      }
 +
 +      if (declarationError) {
 +        suite.onException(declarationError);
 +      }
 +
 +      currentDeclarationSuite = parentSuite;
 +    }
 +
 +    function findFocusedAncestor(suite) {
 +      while (suite) {
 +        if (suite.isFocused) {
 +          return suite.id;
 +        }
 +        suite = suite.parentSuite;
 +      }
 +
 +      return null;
 +    }
 +
 +    function unfocusAncestor() {
 +      var focusedAncestor = findFocusedAncestor(currentDeclarationSuite);
 +      if (focusedAncestor) {
 +        for (var i = 0; i < focusedRunnables.length; i++) {
 +          if (focusedRunnables[i] === focusedAncestor) {
 +            focusedRunnables.splice(i, 1);
 +            break;
 +          }
 +        }
 +      }
 +    }
 +
 +    var specFactory = function(description, fn, suite, timeout) {
 +      totalSpecsDefined++;
 +      var spec = new j$.Spec({
 +        id: getNextSpecId(),
 +        beforeAndAfterFns: beforeAndAfterFns(suite),
 +        expectationFactory: expectationFactory,
 +        asyncExpectationFactory: specAsyncExpectationFactory,
++        deprecated: self.deprecated,
 +        resultCallback: specResultCallback,
 +        getSpecName: function(spec) {
 +          return getSpecName(spec, suite);
 +        },
 +        onStart: specStarted,
 +        description: description,
 +        expectationResultFactory: expectationResultFactory,
 +        queueRunnerFactory: queueRunnerFactory,
 +        userContext: function() {
 +          return suite.clonedSharedUserContext();
 +        },
 +        queueableFn: {
 +          fn: fn,
 +          timeout: timeout || 0
 +        },
 +        throwOnExpectationFailure: config.oneFailurePerSpec,
 +        autoCleanClosures: config.autoCleanClosures,
 +        timer: new j$.Timer()
 +      });
 +      return spec;
 +
 +      function specResultCallback(result, next) {
 +        clearResourcesForRunnable(spec.id);
 +        currentSpec = null;
 +
 +        if (result.status === 'failed') {
 +          hasFailures = true;
 +        }
 +
 +        reporter.specDone(result, next);
 +      }
 +
 +      function specStarted(spec, next) {
 +        currentSpec = spec;
 +        defaultResourcesForRunnable(spec.id, suite.id);
 +        reporter.specStarted(spec.result, next);
 +      }
 +    };
 +
-     this.it = function(description, fn, timeout) {
++    this.it_ = function(description, fn, timeout) {
 +      ensureIsNotNested('it');
 +      // it() sometimes doesn't have a fn argument, so only check the type if
 +      // it's given.
 +      if (arguments.length > 1 && typeof fn !== 'undefined') {
 +        ensureIsFunctionOrAsync(fn, 'it');
 +      }
 +
 +      if (timeout) {
 +        j$.util.validateTimeout(timeout);
 +      }
 +
 +      var spec = specFactory(description, fn, currentDeclarationSuite, timeout);
 +      if (currentDeclarationSuite.markedExcluding) {
 +        spec.exclude();
 +      }
 +      currentDeclarationSuite.addChild(spec);
++
 +      return spec;
 +    };
 +
++    this.it = function(description, fn, timeout) {
++      var spec = this.it_(description, fn, timeout);
++      return j$.deprecatingSpecProxy(spec, this);
++    };
++
 +    this.xit = function(description, fn, timeout) {
 +      ensureIsNotNested('xit');
 +      // xit(), like it(), doesn't always have a fn argument, so only check the
 +      // type when needed.
 +      if (arguments.length > 1 && typeof fn !== 'undefined') {
 +        ensureIsFunctionOrAsync(fn, 'xit');
 +      }
-       var spec = this.it.apply(this, arguments);
++      var spec = this.it_.apply(this, arguments);
 +      spec.exclude('Temporarily disabled with xit');
-       return spec;
++      return j$.deprecatingSpecProxy(spec, this);
 +    };
 +
 +    this.fit = function(description, fn, timeout) {
 +      ensureIsNotNested('fit');
 +      ensureIsFunctionOrAsync(fn, 'fit');
 +
 +      if (timeout) {
 +        j$.util.validateTimeout(timeout);
 +      }
 +      var spec = specFactory(description, fn, currentDeclarationSuite, timeout);
 +      currentDeclarationSuite.addChild(spec);
 +      focusedRunnables.push(spec.id);
 +      unfocusAncestor();
-       return spec;
++      return j$.deprecatingSpecProxy(spec, this);
 +    };
 +
 +    /**
 +     * Sets a user-defined property that will be provided to reporters as part of the properties field of {@link SpecResult}
 +     * @name Env#setSpecProperty
 +     * @since 3.6.0
 +     * @function
 +     * @param {String} key The name of the property
 +     * @param {*} value The value of the property
 +     */
 +    this.setSpecProperty = function(key, value) {
 +      if (!currentRunnable() || currentRunnable() == currentSuite()) {
 +        throw new Error(
 +          "'setSpecProperty' was used when there was no current spec"
 +        );
 +      }
 +      currentRunnable().setSpecProperty(key, value);
 +    };
 +
 +    /**
 +     * Sets a user-defined property that will be provided to reporters as part of the properties field of {@link SuiteResult}
 +     * @name Env#setSuiteProperty
 +     * @since 3.6.0
 +     * @function
 +     * @param {String} key The name of the property
 +     * @param {*} value The value of the property
 +     */
 +    this.setSuiteProperty = function(key, value) {
 +      if (!currentSuite()) {
 +        throw new Error(
 +          "'setSuiteProperty' was used when there was no current suite"
 +        );
 +      }
 +      currentSuite().setSuiteProperty(key, value);
 +    };
 +
 +    this.expect = function(actual) {
 +      if (!currentRunnable()) {
 +        throw new Error(
 +          "'expect' was used when there was no current spec, this could be because an asynchronous test timed out"
 +        );
 +      }
 +
 +      return currentRunnable().expect(actual);
 +    };
 +
 +    this.expectAsync = function(actual) {
 +      if (!currentRunnable()) {
 +        throw new Error(
 +          "'expectAsync' was used when there was no current spec, this could be because an asynchronous test timed out"
 +        );
 +      }
 +
 +      return currentRunnable().expectAsync(actual);
 +    };
 +
 +    this.beforeEach = function(beforeEachFunction, timeout) {
 +      ensureIsNotNested('beforeEach');
 +      ensureIsFunctionOrAsync(beforeEachFunction, 'beforeEach');
 +
 +      if (timeout) {
 +        j$.util.validateTimeout(timeout);
 +      }
 +
 +      currentDeclarationSuite.beforeEach({
 +        fn: beforeEachFunction,
 +        timeout: timeout || 0
 +      });
 +    };
 +
 +    this.beforeAll = function(beforeAllFunction, timeout) {
 +      ensureIsNotNested('beforeAll');
 +      ensureIsFunctionOrAsync(beforeAllFunction, 'beforeAll');
 +
 +      if (timeout) {
 +        j$.util.validateTimeout(timeout);
 +      }
 +
 +      currentDeclarationSuite.beforeAll({
 +        fn: beforeAllFunction,
 +        timeout: timeout || 0
 +      });
 +    };
 +
 +    this.afterEach = function(afterEachFunction, timeout) {
 +      ensureIsNotNested('afterEach');
 +      ensureIsFunctionOrAsync(afterEachFunction, 'afterEach');
 +
 +      if (timeout) {
 +        j$.util.validateTimeout(timeout);
 +      }
 +
 +      afterEachFunction.isCleanup = true;
 +      currentDeclarationSuite.afterEach({
 +        fn: afterEachFunction,
 +        timeout: timeout || 0
 +      });
 +    };
 +
 +    this.afterAll = function(afterAllFunction, timeout) {
 +      ensureIsNotNested('afterAll');
 +      ensureIsFunctionOrAsync(afterAllFunction, 'afterAll');
 +
 +      if (timeout) {
 +        j$.util.validateTimeout(timeout);
 +      }
 +
 +      currentDeclarationSuite.afterAll({
 +        fn: afterAllFunction,
 +        timeout: timeout || 0
 +      });
 +    };
 +
 +    this.pending = function(message) {
 +      var fullMessage = j$.Spec.pendingSpecExceptionMessage;
 +      if (message) {
 +        fullMessage += message;
 +      }
 +      throw fullMessage;
 +    };
 +
 +    this.fail = function(error) {
 +      if (!currentRunnable()) {
 +        throw new Error(
 +          "'fail' was used when there was no current spec, this could be because an asynchronous test timed out"
 +        );
 +      }
 +
 +      var message = 'Failed';
 +      if (error) {
 +        message += ': ';
 +        if (error.message) {
 +          message += error.message;
 +        } else if (j$.isString_(error)) {
 +          message += error;
 +        } else {
 +          // pretty print all kind of objects. This includes arrays.
 +          message += makePrettyPrinter()(error);
 +        }
 +      }
 +
 +      currentRunnable().addExpectationResult(false, {
 +        matcherName: '',
 +        passed: false,
 +        expected: '',
 +        actual: '',
 +        message: message,
 +        error: error && error.message ? error : null
 +      });
 +
 +      if (config.oneFailurePerSpec) {
 +        throw new Error(message);
 +      }
 +    };
 +
 +    this.cleanup_ = function() {
 +      if (globalErrors) {
 +        globalErrors.uninstall();
 +      }
 +    };
 +  }
 +
 +  return Env;
 +};
 +
 +getJasmineRequireObj().JsApiReporter = function(j$) {
 +  /**
 +   * @name jsApiReporter
 +   * @classdesc {@link Reporter} added by default in `boot.js` to record results for retrieval in javascript code. An instance is made available as `jsApiReporter` on the global object.
 +   * @class
 +   * @hideconstructor
 +   */
 +  function JsApiReporter(options) {
 +    var timer = options.timer || new j$.Timer(),
 +      status = 'loaded';
 +
 +    this.started = false;
 +    this.finished = false;
 +    this.runDetails = {};
 +
 +    this.jasmineStarted = function() {
 +      this.started = true;
 +      status = 'started';
 +      timer.start();
 +    };
 +
 +    var executionTime;
 +
 +    this.jasmineDone = function(runDetails) {
 +      this.finished = true;
 +      this.runDetails = runDetails;
 +      executionTime = timer.elapsed();
 +      status = 'done';
 +    };
 +
 +    /**
 +     * Get the current status for the Jasmine environment.
 +     * @name jsApiReporter#status
 +     * @since 2.0.0
 +     * @function
 +     * @return {String} - One of `loaded`, `started`, or `done`
 +     */
 +    this.status = function() {
 +      return status;
 +    };
 +
 +    var suites = [],
 +      suites_hash = {};
 +
 +    this.suiteStarted = function(result) {
 +      suites_hash[result.id] = result;
 +    };
 +
 +    this.suiteDone = function(result) {
 +      storeSuite(result);
 +    };
 +
 +    /**
 +     * Get the results for a set of suites.
 +     *
 +     * Retrievable in slices for easier serialization.
 +     * @name jsApiReporter#suiteResults
 +     * @since 2.1.0
 +     * @function
 +     * @param {Number} index - The position in the suites list to start from.
 +     * @param {Number} length - Maximum number of suite results to return.
 +     * @return {SuiteResult[]}
 +     */
 +    this.suiteResults = function(index, length) {
 +      return suites.slice(index, index + length);
 +    };
 +
 +    function storeSuite(result) {
 +      suites.push(result);
 +      suites_hash[result.id] = result;
 +    }
 +
 +    /**
 +     * Get all of the suites in a single object, with their `id` as the key.
 +     * @name jsApiReporter#suites
 +     * @since 2.0.0
 +     * @function
 +     * @return {Object} - Map of suite id to {@link SuiteResult}
 +     */
 +    this.suites = function() {
 +      return suites_hash;
 +    };
 +
 +    var specs = [];
 +
 +    this.specDone = function(result) {
 +      specs.push(result);
 +    };
 +
 +    /**
 +     * Get the results for a set of specs.
 +     *
 +     * Retrievable in slices for easier serialization.
 +     * @name jsApiReporter#specResults
 +     * @since 2.0.0
 +     * @function
 +     * @param {Number} index - The position in the specs list to start from.
 +     * @param {Number} length - Maximum number of specs results to return.
 +     * @return {SpecResult[]}
 +     */
 +    this.specResults = function(index, length) {
 +      return specs.slice(index, index + length);
 +    };
 +
 +    /**
 +     * Get all spec results.
 +     * @name jsApiReporter#specs
 +     * @since 2.0.0
 +     * @function
 +     * @return {SpecResult[]}
 +     */
 +    this.specs = function() {
 +      return specs;
 +    };
 +
 +    /**
 +     * Get the number of milliseconds it took for the full Jasmine suite to run.
 +     * @name jsApiReporter#executionTime
 +     * @since 2.0.0
 +     * @function
 +     * @return {Number}
 +     */
 +    this.executionTime = function() {
 +      return executionTime;
 +    };
 +  }
 +
 +  return JsApiReporter;
 +};
 +
 +getJasmineRequireObj().Any = function(j$) {
 +  function Any(expectedObject) {
 +    if (typeof expectedObject === 'undefined') {
 +      throw new TypeError(
 +        'jasmine.any() expects to be passed a constructor function. ' +
 +          'Please pass one or use jasmine.anything() to match any object.'
 +      );
 +    }
 +    this.expectedObject = expectedObject;
 +  }
 +
 +  Any.prototype.asymmetricMatch = function(other) {
 +    if (this.expectedObject == String) {
 +      return typeof other == 'string' || other instanceof String;
 +    }
 +
 +    if (this.expectedObject == Number) {
 +      return typeof other == 'number' || other instanceof Number;
 +    }
 +
 +    if (this.expectedObject == Function) {
 +      return typeof other == 'function' || other instanceof Function;
 +    }
 +
 +    if (this.expectedObject == Object) {
 +      return other !== null && typeof other == 'object';
 +    }
 +
 +    if (this.expectedObject == Boolean) {
 +      return typeof other == 'boolean';
 +    }
 +
 +    /* jshint -W122 */
 +    /* global Symbol */
 +    if (typeof Symbol != 'undefined' && this.expectedObject == Symbol) {
 +      return typeof other == 'symbol';
 +    }
 +    /* jshint +W122 */
 +
 +    return other instanceof this.expectedObject;
 +  };
 +
 +  Any.prototype.jasmineToString = function() {
 +    return '<jasmine.any(' + j$.fnNameFor(this.expectedObject) + ')>';
 +  };
 +
 +  return Any;
 +};
 +
 +getJasmineRequireObj().Anything = function(j$) {
 +  function Anything() {}
 +
 +  Anything.prototype.asymmetricMatch = function(other) {
 +    return !j$.util.isUndefined(other) && other !== null;
 +  };
 +
 +  Anything.prototype.jasmineToString = function() {
 +    return '<jasmine.anything>';
 +  };
 +
 +  return Anything;
 +};
 +
 +getJasmineRequireObj().ArrayContaining = function(j$) {
 +  function ArrayContaining(sample) {
 +    this.sample = sample;
 +  }
 +
 +  ArrayContaining.prototype.asymmetricMatch = function(other, matchersUtil) {
 +    if (!j$.isArray_(this.sample)) {
 +      throw new Error(
 +        'You must provide an array to arrayContaining, not ' +
-           j$.pp(this.sample) +
++          j$.basicPrettyPrinter_(this.sample) +
 +          '.'
 +      );
 +    }
 +
 +    // If the actual parameter is not an array, we can fail immediately, since it couldn't
 +    // possibly be an "array containing" anything. However, we also want an empty sample
 +    // array to match anything, so we need to double-check we aren't in that case
 +    if (!j$.isArray_(other) && this.sample.length > 0) {
 +      return false;
 +    }
 +
 +    for (var i = 0; i < this.sample.length; i++) {
 +      var item = this.sample[i];
 +      if (!matchersUtil.contains(other, item)) {
 +        return false;
 +      }
 +    }
 +
 +    return true;
 +  };
 +
 +  ArrayContaining.prototype.jasmineToString = function(pp) {
 +    return '<jasmine.arrayContaining(' + pp(this.sample) + ')>';
 +  };
 +
 +  return ArrayContaining;
 +};
 +
 +getJasmineRequireObj().ArrayWithExactContents = function(j$) {
 +  function ArrayWithExactContents(sample) {
 +    this.sample = sample;
 +  }
 +
 +  ArrayWithExactContents.prototype.asymmetricMatch = function(
 +    other,
 +    matchersUtil
 +  ) {
 +    if (!j$.isArray_(this.sample)) {
 +      throw new Error(
 +        'You must provide an array to arrayWithExactContents, not ' +
-           j$.pp(this.sample) +
++          j$.basicPrettyPrinter_(this.sample) +
 +          '.'
 +      );
 +    }
 +
 +    if (this.sample.length !== other.length) {
 +      return false;
 +    }
 +
 +    for (var i = 0; i < this.sample.length; i++) {
 +      var item = this.sample[i];
 +      if (!matchersUtil.contains(other, item)) {
 +        return false;
 +      }
 +    }
 +
 +    return true;
 +  };
 +
 +  ArrayWithExactContents.prototype.jasmineToString = function(pp) {
 +    return '<jasmine.arrayWithExactContents(' + pp(this.sample) + ')>';
 +  };
 +
 +  return ArrayWithExactContents;
 +};
 +
 +getJasmineRequireObj().Empty = function(j$) {
 +  function Empty() {}
 +
 +  Empty.prototype.asymmetricMatch = function(other) {
 +    if (j$.isString_(other) || j$.isArray_(other) || j$.isTypedArray_(other)) {
 +      return other.length === 0;
 +    }
 +
 +    if (j$.isMap(other) || j$.isSet(other)) {
 +      return other.size === 0;
 +    }
 +
 +    if (j$.isObject_(other)) {
 +      return Object.keys(other).length === 0;
 +    }
 +    return false;
 +  };
 +
 +  Empty.prototype.jasmineToString = function() {
 +    return '<jasmine.empty>';
 +  };
 +
 +  return Empty;
 +};
 +
 +getJasmineRequireObj().Falsy = function(j$) {
 +  function Falsy() {}
 +
 +  Falsy.prototype.asymmetricMatch = function(other) {
 +    return !other;
 +  };
 +
 +  Falsy.prototype.jasmineToString = function() {
 +    return '<jasmine.falsy>';
 +  };
 +
 +  return Falsy;
 +};
 +
 +getJasmineRequireObj().MapContaining = function(j$) {
 +  function MapContaining(sample) {
 +    if (!j$.isMap(sample)) {
 +      throw new Error(
-         'You must provide a map to `mapContaining`, not ' + j$.pp(sample)
++        'You must provide a map to `mapContaining`, not ' +
++          j$.basicPrettyPrinter_(sample)
 +      );
 +    }
 +
 +    this.sample = sample;
 +  }
 +
 +  MapContaining.prototype.asymmetricMatch = function(other, matchersUtil) {
 +    if (!j$.isMap(other)) return false;
 +
 +    var hasAllMatches = true;
 +    j$.util.forEachBreakable(this.sample, function(breakLoop, value, key) {
 +      // for each key/value pair in `sample`
 +      // there should be at least one pair in `other` whose key and value both match
 +      var hasMatch = false;
 +      j$.util.forEachBreakable(other, function(oBreakLoop, oValue, oKey) {
 +        if (
 +          matchersUtil.equals(oKey, key) &&
 +          matchersUtil.equals(oValue, value)
 +        ) {
 +          hasMatch = true;
 +          oBreakLoop();
 +        }
 +      });
 +      if (!hasMatch) {
 +        hasAllMatches = false;
 +        breakLoop();
 +      }
 +    });
 +
 +    return hasAllMatches;
 +  };
 +
 +  MapContaining.prototype.jasmineToString = function(pp) {
 +    return '<jasmine.mapContaining(' + pp(this.sample) + ')>';
 +  };
 +
 +  return MapContaining;
 +};
 +
 +getJasmineRequireObj().NotEmpty = function(j$) {
 +  function NotEmpty() {}
 +
 +  NotEmpty.prototype.asymmetricMatch = function(other) {
 +    if (j$.isString_(other) || j$.isArray_(other) || j$.isTypedArray_(other)) {
 +      return other.length !== 0;
 +    }
 +
 +    if (j$.isMap(other) || j$.isSet(other)) {
 +      return other.size !== 0;
 +    }
 +
 +    if (j$.isObject_(other)) {
 +      return Object.keys(other).length !== 0;
 +    }
 +
 +    return false;
 +  };
 +
 +  NotEmpty.prototype.jasmineToString = function() {
 +    return '<jasmine.notEmpty>';
 +  };
 +
 +  return NotEmpty;
 +};
 +
 +getJasmineRequireObj().ObjectContaining = function(j$) {
 +  function ObjectContaining(sample) {
 +    this.sample = sample;
 +  }
 +
 +  function getPrototype(obj) {
 +    if (Object.getPrototypeOf) {
 +      return Object.getPrototypeOf(obj);
 +    }
 +
 +    if (obj.constructor.prototype == obj) {
 +      return null;
 +    }
 +
 +    return obj.constructor.prototype;
 +  }
 +
 +  function hasProperty(obj, property) {
 +    if (!obj || typeof obj !== 'object') {
 +      return false;
 +    }
 +
 +    if (Object.prototype.hasOwnProperty.call(obj, property)) {
 +      return true;
 +    }
 +
 +    return hasProperty(getPrototype(obj), property);
 +  }
 +
 +  ObjectContaining.prototype.asymmetricMatch = function(other, matchersUtil) {
 +    if (typeof this.sample !== 'object') {
 +      throw new Error(
 +        "You must provide an object to objectContaining, not '" +
 +          this.sample +
 +          "'."
 +      );
 +    }
 +    if (typeof other !== 'object') {
 +      return false;
 +    }
 +
 +    for (var property in this.sample) {
 +      if (
 +        !hasProperty(other, property) ||
 +        !matchersUtil.equals(this.sample[property], other[property])
 +      ) {
 +        return false;
 +      }
 +    }
 +
 +    return true;
 +  };
 +
 +  ObjectContaining.prototype.valuesForDiff_ = function(other, pp) {
 +    if (!j$.isObject_(other)) {
 +      return {
 +        self: this.jasmineToString(pp),
 +        other: other
 +      };
 +    }
 +
 +    var filteredOther = {};
 +    Object.keys(this.sample).forEach(function(k) {
 +      // eq short-circuits comparison of objects that have different key sets,
 +      // so include all keys even if undefined.
 +      filteredOther[k] = other[k];
 +    });
 +
 +    return {
 +      self: this.sample,
 +      other: filteredOther
 +    };
 +  };
 +
 +  ObjectContaining.prototype.jasmineToString = function(pp) {
 +    return '<jasmine.objectContaining(' + pp(this.sample) + ')>';
 +  };
 +
 +  return ObjectContaining;
 +};
 +
 +getJasmineRequireObj().SetContaining = function(j$) {
 +  function SetContaining(sample) {
 +    if (!j$.isSet(sample)) {
 +      throw new Error(
-         'You must provide a set to `setContaining`, not ' + j$.pp(sample)
++        'You must provide a set to `setContaining`, not ' +
++          j$.basicPrettyPrinter_(sample)
 +      );
 +    }
 +
 +    this.sample = sample;
 +  }
 +
 +  SetContaining.prototype.asymmetricMatch = function(other, matchersUtil) {
 +    if (!j$.isSet(other)) return false;
 +
 +    var hasAllMatches = true;
 +    j$.util.forEachBreakable(this.sample, function(breakLoop, item) {
 +      // for each item in `sample` there should be at least one matching item in `other`
 +      // (not using `matchersUtil.contains` because it compares set members by reference,
 +      // not by deep value equality)
 +      var hasMatch = false;
 +      j$.util.forEachBreakable(other, function(oBreakLoop, oItem) {
 +        if (matchersUtil.equals(oItem, item)) {
 +          hasMatch = true;
 +          oBreakLoop();
 +        }
 +      });
 +      if (!hasMatch) {
 +        hasAllMatches = false;
 +        breakLoop();
 +      }
 +    });
 +
 +    return hasAllMatches;
 +  };
 +
 +  SetContaining.prototype.jasmineToString = function(pp) {
 +    return '<jasmine.setContaining(' + pp(this.sample) + ')>';
 +  };
 +
 +  return SetContaining;
 +};
 +
 +getJasmineRequireObj().StringContaining = function(j$) {
 +  function StringContaining(expected) {
 +    if (!j$.isString_(expected)) {
 +      throw new Error('Expected is not a String');
 +    }
 +
 +    this.expected = expected;
 +  }
 +
 +  StringContaining.prototype.asymmetricMatch = function(other) {
 +    if (!j$.isString_(other)) {
 +      // Arrays, etc. don't match no matter what their indexOf returns.
 +      return false;
 +    }
 +
 +    return other.indexOf(this.expected) !== -1;
 +  };
 +
 +  StringContaining.prototype.jasmineToString = function() {
 +    return '<jasmine.stringContaining("' + this.expected + '")>';
 +  };
 +
 +  return StringContaining;
 +};
 +
 +getJasmineRequireObj().StringMatching = function(j$) {
 +  function StringMatching(expected) {
 +    if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) {
 +      throw new Error('Expected is not a String or a RegExp');
 +    }
 +
 +    this.regexp = new RegExp(expected);
 +  }
 +
 +  StringMatching.prototype.asymmetricMatch = function(other) {
 +    return this.regexp.test(other);
 +  };
 +
 +  StringMatching.prototype.jasmineToString = function() {
 +    return '<jasmine.stringMatching(' + this.regexp + ')>';
 +  };
 +
 +  return StringMatching;
 +};
 +
 +getJasmineRequireObj().Truthy = function(j$) {
 +  function Truthy() {}
 +
 +  Truthy.prototype.asymmetricMatch = function(other) {
 +    return !!other;
 +  };
 +
 +  Truthy.prototype.jasmineToString = function() {
 +    return '<jasmine.truthy>';
 +  };
 +
 +  return Truthy;
 +};
 +
 +getJasmineRequireObj().asymmetricEqualityTesterArgCompatShim = function(j$) {
 +  /*
 +    Older versions of Jasmine passed an array of custom equality testers as the
 +    second argument to each asymmetric equality tester's `asymmetricMatch`
 +    method. Newer versions will pass a `MatchersUtil` instance. The
 +    asymmetricEqualityTesterArgCompatShim allows for a graceful migration from
 +    the old interface to the new by "being" both an array of custom equality
 +    testers and a `MatchersUtil` at the same time.
 +
 +    This code should be removed in the next major release.
 +   */
 +
 +  var likelyArrayProps = [
 +    'concat',
 +    'constructor',
 +    'copyWithin',
 +    'entries',
 +    'every',
 +    'fill',
 +    'filter',
 +    'find',
 +    'findIndex',
 +    'flat',
 +    'flatMap',
 +    'forEach',
 +    'includes',
 +    'indexOf',
 +    'join',
 +    'keys',
 +    'lastIndexOf',
 +    'length',
 +    'map',
 +    'pop',
 +    'push',
 +    'reduce',
 +    'reduceRight',
 +    'reverse',
 +    'shift',
 +    'slice',
 +    'some',
 +    'sort',
 +    'splice',
 +    'toLocaleString',
 +    'toSource',
 +    'toString',
 +    'unshift',
 +    'values'
 +  ];
 +
 +  function asymmetricEqualityTesterArgCompatShim(
 +    matchersUtil,
 +    customEqualityTesters
 +  ) {
-     var self = Object.create(matchersUtil),
-       props,
-       i,
-       k;
++    var self = Object.create(matchersUtil);
 +
-     copy(self, customEqualityTesters, 'length');
++    copyAndDeprecate(self, customEqualityTesters, 'length');
 +
 +    for (i = 0; i < customEqualityTesters.length; i++) {
-       copy(self, customEqualityTesters, i);
++      copyAndDeprecate(self, customEqualityTesters, i);
 +    }
 +
-     var props = arrayProps();
++    // Avoid copying array props if we've previously done so,
++    // to avoid triggering our own deprecation warnings.
++    if (!self.isAsymmetricEqualityTesterArgCompatShim_) {
++      copyAndDeprecateArrayMethods(self);
++    }
++
++    self.isAsymmetricEqualityTesterArgCompatShim_ = true;
++    return self;
++  }
++
++  function copyAndDeprecateArrayMethods(dest) {
++    var props = arrayProps(),
++      i,
++      k;
 +
 +    for (i = 0; i < props.length; i++) {
 +      k = props[i];
++
 +      // Skip length (dealt with above), and anything that collides with
 +      // MatchesUtil e.g. an Array.prototype.contains method added by user code
-       if (k !== 'length' && !self[k]) {
-         copy(self, Array.prototype, k);
++      if (k !== 'length' && !dest[k]) {
++        copyAndDeprecate(dest, Array.prototype, k);
 +      }
 +    }
- 
-     return self;
 +  }
 +
-   function copy(dest, src, propName) {
++  function copyAndDeprecate(dest, src, propName) {
 +    Object.defineProperty(dest, propName, {
 +      get: function() {
++        j$.getEnv().deprecated(
++          'The second argument to asymmetricMatch is now a ' +
++            'MatchersUtil. Using it as an array of custom equality testers is ' +
++            'deprecated and will stop working in a future release. ' +
++            'See <https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#asymmetricMatch-cet> for details.'
++        );
 +        return src[propName];
 +      }
 +    });
 +  }
 +
 +  function arrayProps() {
 +    var props, a, k;
 +
 +    if (!Object.getOwnPropertyDescriptors) {
 +      return likelyArrayProps.filter(function(k) {
 +        return Array.prototype.hasOwnProperty(k);
 +      });
 +    }
 +
 +    props = Object.getOwnPropertyDescriptors(Array.prototype); // eslint-disable-line compat/compat
 +    a = [];
 +
 +    for (k in props) {
 +      a.push(k);
 +    }
 +
 +    return a;
 +  }
 +
 +  return asymmetricEqualityTesterArgCompatShim;
 +};
 +
 +getJasmineRequireObj().CallTracker = function(j$) {
 +  /**
 +   * @namespace Spy#calls
 +   * @since 2.0.0
 +   */
 +  function CallTracker() {
 +    var calls = [];
 +    var opts = {};
 +
 +    this.track = function(context) {
 +      if (opts.cloneArgs) {
 +        context.args = j$.util.cloneArgs(context.args);
 +      }
 +      calls.push(context);
 +    };
 +
 +    /**
 +     * Check whether this spy has been invoked.
 +     * @name Spy#calls#any
 +     * @since 2.0.0
 +     * @function
 +     * @return {Boolean}
 +     */
 +    this.any = function() {
 +      return !!calls.length;
 +    };
 +
 +    /**
 +     * Get the number of invocations of this spy.
 +     * @name Spy#calls#count
 +     * @since 2.0.0
 +     * @function
 +     * @return {Integer}
 +     */
 +    this.count = function() {
 +      return calls.length;
 +    };
 +
 +    /**
 +     * Get the arguments that were passed to a specific invocation of this spy.
 +     * @name Spy#calls#argsFor
 +     * @since 2.0.0
 +     * @function
 +     * @param {Integer} index The 0-based invocation index.
 +     * @return {Array}
 +     */
 +    this.argsFor = function(index) {
 +      var call = calls[index];
 +      return call ? call.args : [];
 +    };
 +
 +    /**
 +     * Get the "this" object that was passed to a specific invocation of this spy.
 +     * @name Spy#calls#thisFor
 +     * @since 3.8.0
 +     * @function
 +     * @param {Integer} index The 0-based invocation index.
 +     * @return {Object?}
 +     */
 +    this.thisFor = function(index) {
 +      var call = calls[index];
 +      return call ? call.object : undefined;
 +    };
 +
 +    /**
 +     * Get the raw calls array for this spy.
 +     * @name Spy#calls#all
 +     * @since 2.0.0
 +     * @function
 +     * @return {Spy.callData[]}
 +     */
 +    this.all = function() {
 +      return calls;
 +    };
 +
 +    /**
 +     * Get all of the arguments for each invocation of this spy in the order they were received.
 +     * @name Spy#calls#allArgs
 +     * @since 2.0.0
 +     * @function
 +     * @return {Array}
 +     */
 +    this.allArgs = function() {
 +      var callArgs = [];
 +      for (var i = 0; i < calls.length; i++) {
 +        callArgs.push(calls[i].args);
 +      }
 +
 +      return callArgs;
 +    };
 +
 +    /**
 +     * Get the first invocation of this spy.
 +     * @name Spy#calls#first
 +     * @since 2.0.0
 +     * @function
 +     * @return {ObjecSpy.callData}
 +     */
 +    this.first = function() {
 +      return calls[0];
 +    };
 +
 +    /**
 +     * Get the most recent invocation of this spy.
 +     * @name Spy#calls#mostRecent
 +     * @since 2.0.0
 +     * @function
 +     * @return {ObjecSpy.callData}
 +     */
 +    this.mostRecent = function() {
 +      return calls[calls.length - 1];
 +    };
 +
 +    /**
 +     * Reset this spy as if it has never been called.
 +     * @name Spy#calls#reset
 +     * @since 2.0.0
 +     * @function
 +     */
 +    this.reset = function() {
 +      calls = [];
 +    };
 +
 +    /**
 +     * Set this spy to do a shallow clone of arguments passed to each invocation.
 +     * @name Spy#calls#saveArgumentsByValue
 +     * @since 2.5.0
 +     * @function
 +     */
 +    this.saveArgumentsByValue = function() {
 +      opts.cloneArgs = true;
 +    };
 +  }
 +
 +  return CallTracker;
 +};
 +
 +getJasmineRequireObj().clearStack = function(j$) {
 +  var maxInlineCallCount = 10;
 +
 +  function messageChannelImpl(global, setTimeout) {
 +    var channel = new global.MessageChannel(),
 +      head = {},
 +      tail = head;
 +
 +    var taskRunning = false;
 +    channel.port1.onmessage = function() {
 +      head = head.next;
 +      var task = head.task;
 +      delete head.task;
 +
 +      if (taskRunning) {
 +        global.setTimeout(task, 0);
 +      } else {
 +        try {
 +          taskRunning = true;
 +          task();
 +        } finally {
 +          taskRunning = false;
 +        }
 +      }
 +    };
 +
 +    var currentCallCount = 0;
 +    return function clearStack(fn) {
 +      currentCallCount++;
 +
 +      if (currentCallCount < maxInlineCallCount) {
 +        tail = tail.next = { task: fn };
 +        channel.port2.postMessage(0);
 +      } else {
 +        currentCallCount = 0;
 +        setTimeout(fn);
 +      }
 +    };
 +  }
 +
 +  function getClearStack(global) {
 +    var currentCallCount = 0;
 +    var realSetTimeout = global.setTimeout;
 +    var setTimeoutImpl = function clearStack(fn) {
 +      Function.prototype.apply.apply(realSetTimeout, [global, [fn, 0]]);
 +    };
 +
 +    if (j$.isFunction_(global.setImmediate)) {
 +      var realSetImmediate = global.setImmediate;
 +      return function(fn) {
 +        currentCallCount++;
 +
 +        if (currentCallCount < maxInlineCallCount) {
 +          realSetImmediate(fn);
 +        } else {
 +          currentCallCount = 0;
 +
 +          setTimeoutImpl(fn);
 +        }
 +      };
 +    } else if (!j$.util.isUndefined(global.MessageChannel)) {
 +      return messageChannelImpl(global, setTimeoutImpl);
 +    } else {
 +      return setTimeoutImpl;
 +    }
 +  }
 +
 +  return getClearStack;
 +};
 +
 +getJasmineRequireObj().Clock = function() {
 +  /* global process */
 +  var NODE_JS =
 +    typeof process !== 'undefined' &&
 +    process.versions &&
 +    typeof process.versions.node === 'string';
 +
 +  /**
 +   * @class Clock
 +   * @since 1.3.0
 +   * @classdesc Jasmine's mock clock is used when testing time dependent code.<br>
 +   * _Note:_ Do not construct this directly. You can get the current clock with
 +   * {@link jasmine.clock}.
 +   * @hideconstructor
 +   */
 +  function Clock(global, delayedFunctionSchedulerFactory, mockDate) {
 +    var self = this,
 +      realTimingFunctions = {
 +        setTimeout: global.setTimeout,
 +        clearTimeout: global.clearTimeout,
 +        setInterval: global.setInterval,
 +        clearInterval: global.clearInterval
 +      },
 +      fakeTimingFunctions = {
 +        setTimeout: setTimeout,
 +        clearTimeout: clearTimeout,
 +        setInterval: setInterval,
 +        clearInterval: clearInterval
 +      },
 +      installed = false,
 +      delayedFunctionScheduler,
 +      timer;
 +
 +    self.FakeTimeout = FakeTimeout;
 +
 +    /**
 +     * Install the mock clock over the built-in methods.
 +     * @name Clock#install
 +     * @since 2.0.0
 +     * @function
 +     * @return {Clock}
 +     */
 +    self.install = function() {
 +      if (!originalTimingFunctionsIntact()) {
 +        throw new Error(
 +          'Jasmine Clock was unable to install over custom global timer functions. Is the clock already installed?'
 +        );
 +      }
 +      replace(global, fakeTimingFunctions);
 +      timer = fakeTimingFunctions;
 +      delayedFunctionScheduler = delayedFunctionSchedulerFactory();
 +      installed = true;
 +
 +      return self;
 +    };
 +
 +    /**
 +     * Uninstall the mock clock, returning the built-in methods to their places.
 +     * @name Clock#uninstall
 +     * @since 2.0.0
 +     * @function
 +     */
 +    self.uninstall = function() {
 +      delayedFunctionScheduler = null;
 +      mockDate.uninstall();
 +      replace(global, realTimingFunctions);
 +
 +      timer = realTimingFunctions;
 +      installed = false;
 +    };
 +
 +    /**
 +     * Execute a function with a mocked Clock
 +     *
 +     * The clock will be {@link Clock#install|install}ed before the function is called and {@link Clock#uninstall|uninstall}ed in a `finally` after the function completes.
 +     * @name Clock#withMock
 +     * @since 2.3.0
 +     * @function
 +     * @param {Function} closure The function to be called.
 +     */
 +    self.withMock = function(closure) {
 +      this.install();
 +      try {
 +        closure();
 +      } finally {
 +        this.uninstall();
 +      }
 +    };
 +
 +    /**
 +     * Instruct the installed Clock to also mock the date returned by `new Date()`
 +     * @name Clock#mockDate
 +     * @since 2.1.0
 +     * @function
 +     * @param {Date} [initialDate=now] The `Date` to provide.
 +     */
 +    self.mockDate = function(initialDate) {
 +      mockDate.install(initialDate);
 +    };
 +
 +    self.setTimeout = function(fn, delay, params) {
 +      return Function.prototype.apply.apply(timer.setTimeout, [
 +        global,
 +        arguments
 +      ]);
 +    };
 +
 +    self.setInterval = function(fn, delay, params) {
 +      return Function.prototype.apply.apply(timer.setInterval, [
 +        global,
 +        arguments
 +      ]);
 +    };
 +
 +    self.clearTimeout = function(id) {
 +      return Function.prototype.call.apply(timer.clearTimeout, [global, id]);
 +    };
 +
 +    self.clearInterval = function(id) {
 +      return Function.prototype.call.apply(timer.clearInterval, [global, id]);
 +    };
 +
 +    /**
 +     * Tick the Clock forward, running any enqueued timeouts along the way
 +     * @name Clock#tick
 +     * @since 1.3.0
 +     * @function
 +     * @param {int} millis The number of milliseconds to tick.
 +     */
 +    self.tick = function(millis) {
 +      if (installed) {
 +        delayedFunctionScheduler.tick(millis, function(millis) {
 +          mockDate.tick(millis);
 +        });
 +      } else {
 +        throw new Error(
 +          'Mock clock is not installed, use jasmine.clock().install()'
 +        );
 +      }
 +    };
 +
 +    return self;
 +
 +    function originalTimingFunctionsIntact() {
 +      return (
 +        global.setTimeout === realTimingFunctions.setTimeout &&
 +        global.clearTimeout === realTimingFunctions.clearTimeout &&
 +        global.setInterval === realTimingFunctions.setInterval &&
 +        global.clearInterval === realTimingFunctions.clearInterval
 +      );
 +    }
 +
 +    function replace(dest, source) {
 +      for (var prop in source) {
 +        dest[prop] = source[prop];
 +      }
 +    }
 +
 +    function setTimeout(fn, delay) {
 +      if (!NODE_JS) {
 +        return delayedFunctionScheduler.scheduleFunction(
 +          fn,
 +          delay,
 +          argSlice(arguments, 2)
 +        );
 +      }
 +
 +      var timeout = new FakeTimeout();
 +
 +      delayedFunctionScheduler.scheduleFunction(
 +        fn,
 +        delay,
 +        argSlice(arguments, 2),
 +        false,
 +        timeout
 +      );
 +
 +      return timeout;
 +    }
 +
 +    function clearTimeout(id) {
 +      return delayedFunctionScheduler.removeFunctionWithId(id);
 +    }
 +
 +    function setInterval(fn, interval) {
 +      if (!NODE_JS) {
 +        return delayedFunctionScheduler.scheduleFunction(
 +          fn,
 +          interval,
 +          argSlice(arguments, 2),
 +          true
 +        );
 +      }
 +
 +      var timeout = new FakeTimeout();
 +
 +      delayedFunctionScheduler.scheduleFunction(
 +        fn,
 +        interval,
 +        argSlice(arguments, 2),
 +        true,
 +        timeout
 +      );
 +
 +      return timeout;
 +    }
 +
 +    function clearInterval(id) {
 +      return delayedFunctionScheduler.removeFunctionWithId(id);
 +    }
 +
 +    function argSlice(argsObj, n) {
 +      return Array.prototype.slice.call(argsObj, n);
 +    }
 +  }
 +
 +  /**
 +   * Mocks Node.js Timeout class
 +   */
 +  function FakeTimeout() {}
 +
 +  FakeTimeout.prototype.ref = function() {
 +    return this;
 +  };
 +
 +  FakeTimeout.prototype.unref = function() {
 +    return this;
 +  };
 +
 +  return Clock;
 +};
 +
 +getJasmineRequireObj().DelayedFunctionScheduler = function(j$) {
 +  function DelayedFunctionScheduler() {
 +    var self = this;
 +    var scheduledLookup = [];
 +    var scheduledFunctions = {};
 +    var currentTime = 0;
 +    var delayedFnCount = 0;
 +    var deletedKeys = [];
++    var ticking = false;
 +
 +    self.tick = function(millis, tickDate) {
-       millis = millis || 0;
-       var endTime = currentTime + millis;
++      if (ticking) {
++        j$.getEnv().deprecated(
++          'The behavior of reentrant calls to jasmine.clock().tick() will ' +
++            'change in a future version. Either modify the affected spec to ' +
++            'not call tick() from within a setTimeout or setInterval handler, ' +
++            'or be aware that it may behave differently in the future. See ' +
++            '<https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#deprecations-due-to-reentrant-calls-to-jasmine-clock-tick> ' +
++            'for details.'
++        );
++      }
++
++      ticking = true;
++
++      try {
++        millis = millis || 0;
++        var endTime = currentTime + millis;
 +
-       runScheduledFunctions(endTime, tickDate);
-       currentTime = endTime;
++        runScheduledFunctions(endTime, tickDate);
++        currentTime = endTime;
++      } finally {
++        ticking = false;
++      }
 +    };
 +
 +    self.scheduleFunction = function(
 +      funcToCall,
 +      millis,
 +      params,
 +      recurring,
 +      timeoutKey,
 +      runAtMillis
 +    ) {
 +      var f;
 +      if (typeof funcToCall === 'string') {
 +        /* jshint evil: true */
 +        f = function() {
 +          return eval(funcToCall);
 +        };
 +        /* jshint evil: false */
 +      } else {
 +        f = funcToCall;
 +      }
 +
 +      millis = millis || 0;
 +      timeoutKey = timeoutKey || ++delayedFnCount;
 +      runAtMillis = runAtMillis || currentTime + millis;
 +
 +      var funcToSchedule = {
 +        runAtMillis: runAtMillis,
 +        funcToCall: f,
 +        recurring: recurring,
 +        params: params,
 +        timeoutKey: timeoutKey,
 +        millis: millis
 +      };
 +
 +      if (runAtMillis in scheduledFunctions) {
 +        scheduledFunctions[runAtMillis].push(funcToSchedule);
 +      } else {
 +        scheduledFunctions[runAtMillis] = [funcToSchedule];
 +        scheduledLookup.push(runAtMillis);
 +        scheduledLookup.sort(function(a, b) {
 +          return a - b;
 +        });
 +      }
 +
 +      return timeoutKey;
 +    };
 +
 +    self.removeFunctionWithId = function(timeoutKey) {
 +      deletedKeys.push(timeoutKey);
 +
 +      for (var runAtMillis in scheduledFunctions) {
 +        var funcs = scheduledFunctions[runAtMillis];
 +        var i = indexOfFirstToPass(funcs, function(func) {
 +          return func.timeoutKey === timeoutKey;
 +        });
 +
 +        if (i > -1) {
 +          if (funcs.length === 1) {
 +            delete scheduledFunctions[runAtMillis];
 +            deleteFromLookup(runAtMillis);
 +          } else {
 +            funcs.splice(i, 1);
 +          }
 +
 +          // intervals get rescheduled when executed, so there's never more
 +          // than a single scheduled function with a given timeoutKey
 +          break;
 +        }
 +      }
 +    };
 +
 +    return self;
 +
 +    function indexOfFirstToPass(array, testFn) {
 +      var index = -1;
 +
 +      for (var i = 0; i < array.length; ++i) {
 +        if (testFn(array[i])) {
 +          index = i;
 +          break;
 +        }
 +      }
 +
 +      return index;
 +    }
 +
 +    function deleteFromLookup(key) {
 +      var value = Number(key);
 +      var i = indexOfFirstToPass(scheduledLookup, function(millis) {
 +        return millis === value;
 +      });
 +
 +      if (i > -1) {
 +        scheduledLookup.splice(i, 1);
 +      }
 +    }
 +
 +    function reschedule(scheduledFn) {
 +      self.scheduleFunction(
 +        scheduledFn.funcToCall,
 +        scheduledFn.millis,
 +        scheduledFn.params,
 +        true,
 +        scheduledFn.timeoutKey,
 +        scheduledFn.runAtMillis + scheduledFn.millis
 +      );
 +    }
 +
 +    function forEachFunction(funcsToRun, callback) {
 +      for (var i = 0; i < funcsToRun.length; ++i) {
 +        callback(funcsToRun[i]);
 +      }
 +    }
 +
 +    function runScheduledFunctions(endTime, tickDate) {
 +      tickDate = tickDate || function() {};
 +      if (scheduledLookup.length === 0 || scheduledLookup[0] > endTime) {
 +        tickDate(endTime - currentTime);
 +        return;
 +      }
 +
 +      do {
 +        deletedKeys = [];
 +        var newCurrentTime = scheduledLookup.shift();
 +        tickDate(newCurrentTime - currentTime);
 +
 +        currentTime = newCurrentTime;
 +
 +        var funcsToRun = scheduledFunctions[currentTime];
 +
 +        delete scheduledFunctions[currentTime];
 +
 +        forEachFunction(funcsToRun, function(funcToRun) {
 +          if (funcToRun.recurring) {
 +            reschedule(funcToRun);
 +          }
 +        });
 +
 +        forEachFunction(funcsToRun, function(funcToRun) {
 +          if (j$.util.arrayContains(deletedKeys, funcToRun.timeoutKey)) {
 +            // skip a timeoutKey deleted whilst we were running
 +            return;
 +          }
 +          funcToRun.funcToCall.apply(null, funcToRun.params || []);
 +        });
 +        deletedKeys = [];
 +      } while (
 +        scheduledLookup.length > 0 &&
 +        // checking first if we're out of time prevents setTimeout(0)
 +        // scheduled in a funcToRun from forcing an extra iteration
 +        currentTime !== endTime &&
 +        scheduledLookup[0] <= endTime
 +      );
 +
 +      // ran out of functions to call, but still time left on the clock
 +      if (currentTime !== endTime) {
 +        tickDate(endTime - currentTime);
 +      }
 +    }
 +  }
 +
 +  return DelayedFunctionScheduler;
 +};
 +
++/* eslint-disable compat/compat */
++// TODO: Remove this in the next major release.
++getJasmineRequireObj().deprecatingSpecProxy = function(j$) {
++  function isMember(target, prop) {
++    return (
++      Object.keys(target).indexOf(prop) !== -1 ||
++      Object.keys(j$.Spec.prototype).indexOf(prop) !== -1
++    );
++  }
++
++  function isAllowedMember(prop) {
++    return prop === 'id' || prop === 'description' || prop === 'getFullName';
++  }
++
++  function msg(member) {
++    var memberName = member.toString().replace(/^Symbol\((.+)\)$/, '$1');
++    return (
++      'Access to private Spec members (in this case `' +
++      memberName +
++      '`) is not supported and will break in ' +
++      'a future release. See <https://jasmine.github.io/api/edge/Spec.html> ' +
++      'for correct usage.'
++    );
++  }
++
++  try {
++    new Proxy({}, {});
++  } catch (e) {
++    // Environment does not support Poxy.
++    return function(spec) {
++      return spec;
++    };
++  }
++
++  function DeprecatingSpecProxyHandler(env) {
++    this._env = env;
++  }
++
++  DeprecatingSpecProxyHandler.prototype.get = function(target, prop, receiver) {
++    this._maybeDeprecate(target, prop);
++
++    if (prop === 'getFullName') {
++      // getFullName calls a private method. Re-bind 'this' to avoid a bogus
++      // deprecation warning.
++      return target.getFullName.bind(target);
++    } else {
++      return target[prop];
++    }
++  };
++
++  DeprecatingSpecProxyHandler.prototype.set = function(target, prop, value) {
++    this._maybeDeprecate(target, prop);
++    return (target[prop] = value);
++  };
++
++  DeprecatingSpecProxyHandler.prototype._maybeDeprecate = function(
++    target,
++    prop
++  ) {
++    if (isMember(target, prop) && !isAllowedMember(prop)) {
++      this._env.deprecated(msg(prop));
++    }
++  };
++
++  function deprecatingSpecProxy(spec, env) {
++    return new Proxy(spec, new DeprecatingSpecProxyHandler(env));
++  }
++
++  return deprecatingSpecProxy;
++};
++
++/* eslint-disable compat/compat */
++// TODO: Remove this in the next major release.
++getJasmineRequireObj().deprecatingSuiteProxy = function(j$) {
++  var allowedMembers = [
++    'id',
++    'children',
++    'description',
++    'parentSuite',
++    'getFullName'
++  ];
++
++  function isMember(target, prop) {
++    return (
++      Object.keys(target).indexOf(prop) !== -1 ||
++      Object.keys(j$.Suite.prototype).indexOf(prop) !== -1
++    );
++  }
++
++  function isAllowedMember(prop) {
++    return allowedMembers.indexOf(prop) !== -1;
++  }
++
++  function msg(member) {
++    var memberName = member.toString().replace(/^Symbol\((.+)\)$/, '$1');
++    return (
++      'Access to private Suite members (in this case `' +
++      memberName +
++      '`) is not supported and will break in ' +
++      'a future release. See <https://jasmine.github.io/api/edge/Suite.html> ' +
++      'for correct usage.'
++    );
++  }
++  try {
++    new Proxy({}, {});
++  } catch (e) {
++    // Environment does not support Poxy.
++    return function(suite) {
++      return suite;
++    };
++  }
++
++  function DeprecatingSuiteProxyHandler(parentSuite, env) {
++    this._parentSuite = parentSuite;
++    this._env = env;
++  }
++
++  DeprecatingSuiteProxyHandler.prototype.get = function(
++    target,
++    prop,
++    receiver
++  ) {
++    if (prop === 'children') {
++      if (!this._children) {
++        this._children = target.children.map(
++          this._proxyForChild.bind(this, receiver)
++        );
++      }
++
++      return this._children;
++    } else if (prop === 'parentSuite') {
++      return this._parentSuite;
++    } else {
++      this._maybeDeprecate(target, prop);
++      return target[prop];
++    }
++  };
++
++  DeprecatingSuiteProxyHandler.prototype.set = function(target, prop, value) {
++    this._maybeDeprecate(target, prop);
++    return (target[prop] = value);
++  };
++
++  DeprecatingSuiteProxyHandler.prototype._maybeDeprecate = function(
++    target,
++    prop
++  ) {
++    if (isMember(target, prop) && !isAllowedMember(prop)) {
++      this._env.deprecated(msg(prop));
++    }
++  };
++
++  DeprecatingSuiteProxyHandler.prototype._proxyForChild = function(
++    ownProxy,
++    child
++  ) {
++    if (child.children) {
++      return deprecatingSuiteProxy(child, ownProxy, this._env);
++    } else {
++      return j$.deprecatingSpecProxy(child, this._env);
++    }
++  };
++
++  function deprecatingSuiteProxy(suite, parentSuite, env) {
++    return new Proxy(suite, new DeprecatingSuiteProxyHandler(parentSuite, env));
++  }
++
++  return deprecatingSuiteProxy;
++};
++
++/* eslint-disable compat/compat */
++// TODO: Remove this in the next major release.
++getJasmineRequireObj().deprecatingThisProxy = function(j$) {
++  var msg =
++    "Access to 'this' in describe functions (and in arrow functions " +
++    'inside describe functions) is deprecated.';
++
++  try {
++    new Proxy({}, {});
++  } catch (e) {
++    // Environment does not support Poxy.
++    return function(suite) {
++      return suite;
++    };
++  }
++
++  function DeprecatingThisProxyHandler(env) {
++    this._env = env;
++  }
++
++  DeprecatingThisProxyHandler.prototype.get = function(target, prop, receiver) {
++    this._env.deprecated(msg);
++    return target[prop];
++  };
++
++  DeprecatingThisProxyHandler.prototype.set = function(target, prop, value) {
++    this._env.deprecated(msg);
++    return (target[prop] = value);
++  };
++
++  return function(suite, env) {
++    return new Proxy(suite, new DeprecatingThisProxyHandler(env));
++  };
++};
++
++getJasmineRequireObj().Deprecator = function(j$) {
++  function Deprecator(topSuite) {
++    this.topSuite_ = topSuite;
++    this.verbose_ = false;
++    this.toSuppress_ = [];
++  }
++
++  var verboseNote =
++    'Note: This message will be shown only once. Set the verboseDeprecations ' +
++    'config property to true to see every occurrence.';
++
++  Deprecator.prototype.verboseDeprecations = function(enabled) {
++    this.verbose_ = enabled;
++  };
++
++  // runnable is a spec or a suite.
++  // deprecation is a string or an Error.
++  // See Env#deprecated for a description of the options argument.
++  Deprecator.prototype.addDeprecationWarning = function(
++    runnable,
++    deprecation,
++    options
++  ) {
++    options = options || {};
++
++    if (!this.verbose_ && !j$.isError_(deprecation)) {
++      if (this.toSuppress_.indexOf(deprecation) !== -1) {
++        return;
++      }
++      this.toSuppress_.push(deprecation);
++    }
++
++    this.log_(runnable, deprecation, options);
++    this.report_(runnable, deprecation, options);
++  };
++
++  Deprecator.prototype.log_ = function(runnable, deprecation, options) {
++    var context;
++
++    if (j$.isError_(deprecation)) {
++      console.error(deprecation);
++      return;
++    }
++
++    if (runnable === this.topSuite_ || options.ignoreRunnable) {
++      context = '';
++    } else if (runnable.children) {
++      context = ' (in suite: ' + runnable.getFullName() + ')';
++    } else {
++      context = ' (in spec: ' + runnable.getFullName() + ')';
++    }
++
++    if (!options.omitStackTrace) {
++      context += '\n' + this.stackTrace_();
++    }
++
++    if (!this.verbose_) {
++      context += '\n' + verboseNote;
++    }
++
++    console.error('DEPRECATION: ' + deprecation + context);
++  };
++
++  Deprecator.prototype.stackTrace_ = function() {
++    var formatter = new j$.ExceptionFormatter();
++    return formatter.stack(j$.util.errorWithStack()).replace(/^Error\n/m, '');
++  };
++
++  Deprecator.prototype.report_ = function(runnable, deprecation, options) {
++    if (options.ignoreRunnable) {
++      runnable = this.topSuite_;
++    }
++
++    if (j$.isError_(deprecation)) {
++      runnable.addDeprecationWarning(deprecation);
++      return;
++    }
++
++    if (!this.verbose_) {
++      deprecation += '\n' + verboseNote;
++    }
++
++    runnable.addDeprecationWarning({
++      message: deprecation,
++      omitStackTrace: options.omitStackTrace || false
++    });
++  };
++
++  return Deprecator;
++};
++
 +getJasmineRequireObj().errors = function() {
 +  function ExpectationFailed() {}
 +
 +  ExpectationFailed.prototype = new Error();
 +  ExpectationFailed.prototype.constructor = ExpectationFailed;
 +
 +  return {
 +    ExpectationFailed: ExpectationFailed
 +  };
 +};
 +
 +getJasmineRequireObj().ExceptionFormatter = function(j$) {
 +  var ignoredProperties = [
 +    'name',
 +    'message',
 +    'stack',
 +    'fileName',
 +    'sourceURL',
 +    'line',
 +    'lineNumber',
 +    'column',
 +    'description',
 +    'jasmineMessage'
 +  ];
 +
 +  function ExceptionFormatter(options) {
 +    var jasmineFile = (options && options.jasmineFile) || j$.util.jasmineFile();
 +    this.message = function(error) {
 +      var message = '';
 +
 +      if (error.jasmineMessage) {
 +        message += error.jasmineMessage;
 +      } else if (error.name && error.message) {
 +        message += error.name + ': ' + error.message;
 +      } else if (error.message) {
 +        message += error.message;
 +      } else {
 +        message += error.toString() + ' thrown';
 +      }
 +
 +      if (error.fileName || error.sourceURL) {
 +        message += ' in ' + (error.fileName || error.sourceURL);
 +      }
 +
 +      if (error.line || error.lineNumber) {
 +        message += ' (line ' + (error.line || error.lineNumber) + ')';
 +      }
 +
 +      return message;
 +    };
 +
 +    this.stack = function(error) {
 +      if (!error || !error.stack) {
 +        return null;
 +      }
 +
 +      var stackTrace = new j$.StackTrace(error);
 +      var lines = filterJasmine(stackTrace);
 +      var result = '';
 +
 +      if (stackTrace.message) {
 +        lines.unshift(stackTrace.message);
 +      }
 +
 +      result += formatProperties(error);
 +      result += lines.join('\n');
 +
 +      return result;
 +    };
 +
 +    function filterJasmine(stackTrace) {
 +      var result = [],
 +        jasmineMarker =
 +          stackTrace.style === 'webkit' ? '<Jasmine>' : '    at <Jasmine>';
 +
 +      stackTrace.frames.forEach(function(frame) {
 +        if (frame.file !== jasmineFile) {
 +          result.push(frame.raw);
 +        } else if (result[result.length - 1] !== jasmineMarker) {
 +          result.push(jasmineMarker);
 +        }
 +      });
 +
 +      return result;
 +    }
 +
 +    function formatProperties(error) {
 +      if (!(error instanceof Object)) {
 +        return;
 +      }
 +
 +      var result = {};
 +      var empty = true;
 +
 +      for (var prop in error) {
 +        if (j$.util.arrayContains(ignoredProperties, prop)) {
 +          continue;
 +        }
 +        result[prop] = error[prop];
 +        empty = false;
 +      }
 +
 +      if (!empty) {
-         return 'error properties: ' + j$.pp(result) + '\n';
++        return 'error properties: ' + j$.basicPrettyPrinter_(result) + '\n';
 +      }
 +
 +      return '';
 +    }
 +  }
 +
 +  return ExceptionFormatter;
 +};
 +
 +getJasmineRequireObj().Expectation = function(j$) {
 +  /**
 +   * Matchers that come with Jasmine out of the box.
 +   * @namespace matchers
 +   */
 +  function Expectation(options) {
 +    this.expector = new j$.Expector(options);
 +
 +    var customMatchers = options.customMatchers || {};
 +    for (var matcherName in customMatchers) {
 +      this[matcherName] = wrapSyncCompare(
 +        matcherName,
 +        customMatchers[matcherName]
 +      );
 +    }
 +  }
 +
 +  /**
 +   * Add some context for an {@link expect}
 +   * @function
 +   * @name matchers#withContext
 +   * @since 3.3.0
 +   * @param {String} message - Additional context to show when the matcher fails
 +   * @return {matchers}
 +   */
 +  Expectation.prototype.withContext = function withContext(message) {
 +    return addFilter(this, new ContextAddingFilter(message));
 +  };
 +
 +  /**
 +   * Invert the matcher following this {@link expect}
 +   * @member
 +   * @name matchers#not
 +   * @since 1.3.0
 +   * @type {matchers}
 +   * @example
 +   * expect(something).not.toBe(true);
 +   */
 +  Object.defineProperty(Expectation.prototype, 'not', {
 +    get: function() {
 +      return addFilter(this, syncNegatingFilter);
 +    }
 +  });
 +
 +  /**
 +   * Asynchronous matchers that operate on an actual value which is a promise,
 +   * and return a promise.
 +   *
 +   * Most async matchers will wait indefinitely for the promise to be resolved
 +   * or rejected, resulting in a spec timeout if that never happens. If you
 +   * expect that the promise will already be resolved or rejected at the time
 +   * the matcher is called, you can use the {@link async-matchers#already}
 +   * modifier to get a faster failure with a more helpful message.
 +   *
 +   * Note: Specs must await the result of each async matcher, return the
 +   * promise returned by the matcher, or return a promise that's derived from
 +   * the one returned by the matcher. Otherwise the matcher will not be
 +   * evaluated before the spec completes.
 +   *
 +   * @example
 +   * // Good
 +   * await expectAsync(aPromise).toBeResolved();
 +   * @example
 +   * // Good
 +   * return expectAsync(aPromise).toBeResolved();
 +   * @example
 +   * // Good
 +   * return expectAsync(aPromise).toBeResolved()
 +   *  .then(function() {
 +   *    // more spec code
 +   *  });
 +   * @example
 +   * // Bad
 +   * expectAsync(aPromise).toBeResolved();
 +   * @namespace async-matchers
 +   */
 +  function AsyncExpectation(options) {
 +    var global = options.global || j$.getGlobal();
 +    this.expector = new j$.Expector(options);
 +
 +    if (!global.Promise) {
 +      throw new Error(
 +        'expectAsync is unavailable because the environment does not support promises.'
 +      );
 +    }
 +
 +    var customAsyncMatchers = options.customAsyncMatchers || {};
 +    for (var matcherName in customAsyncMatchers) {
 +      this[matcherName] = wrapAsyncCompare(
 +        matcherName,
 +        customAsyncMatchers[matcherName]
 +      );
 +    }
 +  }
 +
 +  /**
 +   * Add some context for an {@link expectAsync}
 +   * @function
 +   * @name async-matchers#withContext
 +   * @since 3.3.0
 +   * @param {String} message - Additional context to show when the async matcher fails
 +   * @return {async-matchers}
 +   */
 +  AsyncExpectation.prototype.withContext = function withContext(message) {
 +    return addFilter(this, new ContextAddingFilter(message));
 +  };
 +
 +  /**
 +   * Invert the matcher following this {@link expectAsync}
 +   * @member
 +   * @name async-matchers#not
 +   * @type {async-matchers}
 +   * @example
 +   * await expectAsync(myPromise).not.toBeResolved();
 +   * @example
 +   * return expectAsync(myPromise).not.toBeResolved();
 +   */
 +  Object.defineProperty(AsyncExpectation.prototype, 'not', {
 +    get: function() {
 +      return addFilter(this, asyncNegatingFilter);
 +    }
 +  });
 +
 +  /**
 +   * Fail as soon as possible if the actual is pending.
 +   * Otherwise evaluate the matcher.
 +   * @member
 +   * @name async-matchers#already
 +   * @since 3.8.0
 +   * @type {async-matchers}
 +   * @example
 +   * await expectAsync(myPromise).already.toBeResolved();
 +   * @example
 +   * return expectAsync(myPromise).already.toBeResolved();
 +   */
 +  Object.defineProperty(AsyncExpectation.prototype, 'already', {
 +    get: function() {
 +      return addFilter(this, expectSettledPromiseFilter);
 +    }
 +  });
 +
 +  function wrapSyncCompare(name, matcherFactory) {
 +    return function() {
 +      var result = this.expector.compare(name, matcherFactory, arguments);
 +      this.expector.processResult(result);
 +    };
 +  }
 +
 +  function wrapAsyncCompare(name, matcherFactory) {
 +    return function() {
 +      var self = this;
 +
 +      // Capture the call stack here, before we go async, so that it will contain
 +      // frames that are relevant to the user instead of just parts of Jasmine.
 +      var errorForStack = j$.util.errorWithStack();
 +
 +      return this.expector
 +        .compare(name, matcherFactory, arguments)
 +        .then(function(result) {
 +          self.expector.processResult(result, errorForStack);
 +        });
 +    };
 +  }
 +
 +  function addCoreMatchers(prototype, matchers, wrapper) {
 +    for (var matcherName in matchers) {
 +      var matcher = matchers[matcherName];
 +      prototype[matcherName] = wrapper(matcherName, matcher);
 +    }
 +  }
 +
 +  function addFilter(source, filter) {
 +    var result = Object.create(source);
 +    result.expector = source.expector.addFilter(filter);
 +    return result;
 +  }
 +
 +  function negatedFailureMessage(result, matcherName, args, matchersUtil) {
 +    if (result.message) {
 +      if (j$.isFunction_(result.message)) {
 +        return result.message();
 +      } else {
 +        return result.message;
 +      }
 +    }
 +
 +    args = args.slice();
 +    args.unshift(true);
 +    args.unshift(matcherName);
 +    return matchersUtil.buildFailureMessage.apply(matchersUtil, args);
 +  }
 +
 +  function negate(result) {
 +    result.pass = !result.pass;
 +    return result;
 +  }
 +
 +  var syncNegatingFilter = {
 +    selectComparisonFunc: function(matcher) {
 +      function defaultNegativeCompare() {
 +        return negate(matcher.compare.apply(null, arguments));
 +      }
 +
 +      return matcher.negativeCompare || defaultNegativeCompare;
 +    },
 +    buildFailureMessage: negatedFailureMessage
 +  };
 +
 +  var asyncNegatingFilter = {
 +    selectComparisonFunc: function(matcher) {
 +      function defaultNegativeCompare() {
 +        return matcher.compare.apply(this, arguments).then(negate);
 +      }
 +
 +      return matcher.negativeCompare || defaultNegativeCompare;
 +    },
 +    buildFailureMessage: negatedFailureMessage
 +  };
 +
 +  var expectSettledPromiseFilter = {
 +    selectComparisonFunc: function(matcher) {
 +      return function(actual) {
 +        var matcherArgs = arguments;
 +
 +        return j$.isPending_(actual).then(function(isPending) {
 +          if (isPending) {
 +            return {
 +              pass: false,
 +              message:
 +                'Expected a promise to be settled (via ' +
 +                'expectAsync(...).already) but it was pending.'
 +            };
 +          } else {
 +            return matcher.compare.apply(null, matcherArgs);
 +          }
 +        });
 +      };
 +    }
 +  };
 +
 +  function ContextAddingFilter(message) {
 +    this.message = message;
 +  }
 +
 +  ContextAddingFilter.prototype.modifyFailureMessage = function(msg) {
 +    var nl = msg.indexOf('\n');
 +
 +    if (nl === -1) {
 +      return this.message + ': ' + msg;
 +    } else {
 +      return this.message + ':\n' + indent(msg);
 +    }
 +  };
 +
 +  function indent(s) {
 +    return s.replace(/^/gm, '    ');
 +  }
 +
 +  return {
 +    factory: function(options) {
 +      return new Expectation(options || {});
 +    },
 +    addCoreMatchers: function(matchers) {
 +      addCoreMatchers(Expectation.prototype, matchers, wrapSyncCompare);
 +    },
 +    asyncFactory: function(options) {
 +      return new AsyncExpectation(options || {});
 +    },
 +    addAsyncCoreMatchers: function(matchers) {
 +      addCoreMatchers(AsyncExpectation.prototype, matchers, wrapAsyncCompare);
 +    }
 +  };
 +};
 +
 +getJasmineRequireObj().ExpectationFilterChain = function() {
 +  function ExpectationFilterChain(maybeFilter, prev) {
 +    this.filter_ = maybeFilter;
 +    this.prev_ = prev;
 +  }
 +
 +  ExpectationFilterChain.prototype.addFilter = function(filter) {
 +    return new ExpectationFilterChain(filter, this);
 +  };
 +
 +  ExpectationFilterChain.prototype.selectComparisonFunc = function(matcher) {
 +    return this.callFirst_('selectComparisonFunc', arguments).result;
 +  };
 +
 +  ExpectationFilterChain.prototype.buildFailureMessage = function(
 +    result,
 +    matcherName,
 +    args,
 +    matchersUtil
 +  ) {
 +    return this.callFirst_('buildFailureMessage', arguments).result;
 +  };
 +
 +  ExpectationFilterChain.prototype.modifyFailureMessage = function(msg) {
 +    var result = this.callFirst_('modifyFailureMessage', arguments).result;
 +    return result || msg;
 +  };
 +
 +  ExpectationFilterChain.prototype.callFirst_ = function(fname, args) {
 +    var prevResult;
 +
 +    if (this.prev_) {
 +      prevResult = this.prev_.callFirst_(fname, args);
 +
 +      if (prevResult.found) {
 +        return prevResult;
 +      }
 +    }
 +
 +    if (this.filter_ && this.filter_[fname]) {
 +      return {
 +        found: true,
 +        result: this.filter_[fname].apply(this.filter_, args)
 +      };
 +    }
 +
 +    return { found: false };
 +  };
 +
 +  return ExpectationFilterChain;
 +};
 +
 +//TODO: expectation result may make more sense as a presentation of an expectation.
 +getJasmineRequireObj().buildExpectationResult = function(j$) {
 +  function buildExpectationResult(options) {
 +    var messageFormatter = options.messageFormatter || function() {},
 +      stackFormatter = options.stackFormatter || function() {};
 +
 +    /**
 +     * @typedef Expectation
 +     * @property {String} matcherName - The name of the matcher that was executed for this expectation.
 +     * @property {String} message - The failure message for the expectation.
 +     * @property {String} stack - The stack trace for the failure if available.
 +     * @property {Boolean} passed - Whether the expectation passed or failed.
 +     * @property {Object} expected - If the expectation failed, what was the expected value.
 +     * @property {Object} actual - If the expectation failed, what actual value was produced.
 +     */
 +    var result = {
 +      matcherName: options.matcherName,
 +      message: message(),
-       stack: stack(),
++      stack: options.omitStackTrace ? '' : stack(),
 +      passed: options.passed
 +    };
 +
 +    if (!result.passed) {
 +      result.expected = options.expected;
 +      result.actual = options.actual;
 +
 +      if (options.error && !j$.isString_(options.error)) {
 +        if ('code' in options.error) {
 +          result.code = options.error.code;
 +        }
 +
 +        if (
 +          options.error.code === 'ERR_ASSERTION' &&
 +          options.expected === '' &&
 +          options.actual === ''
 +        ) {
 +          result.expected = options.error.expected;
 +          result.actual = options.error.actual;
 +          result.matcherName = 'assert ' + options.error.operator;
 +        }
 +      }
 +    }
 +
 +    return result;
 +
 +    function message() {
 +      if (options.passed) {
 +        return 'Passed.';
 +      } else if (options.message) {
 +        return options.message;
 +      } else if (options.error) {
 +        return messageFormatter(options.error);
 +      }
 +      return '';
 +    }
 +
 +    function stack() {
 +      if (options.passed) {
 +        return '';
 +      }
 +
 +      var error = options.error;
 +      if (!error) {
 +        if (options.errorForStack) {
 +          error = options.errorForStack;
 +        } else if (options.stack) {
 +          error = options;
 +        } else {
 +          try {
 +            throw new Error(message());
 +          } catch (e) {
 +            error = e;
 +          }
 +        }
 +      }
 +      return stackFormatter(error);
 +    }
 +  }
 +
 +  return buildExpectationResult;
 +};
 +
 +getJasmineRequireObj().Expector = function(j$) {
 +  function Expector(options) {
 +    this.matchersUtil = options.matchersUtil || {
 +      buildFailureMessage: function() {}
 +    };
 +    this.customEqualityTesters = options.customEqualityTesters || [];
 +    this.actual = options.actual;
 +    this.addExpectationResult = options.addExpectationResult || function() {};
 +    this.filters = new j$.ExpectationFilterChain();
 +  }
 +
 +  Expector.prototype.instantiateMatcher = function(
 +    matcherName,
 +    matcherFactory,
 +    args
 +  ) {
 +    this.matcherName = matcherName;
 +    this.args = Array.prototype.slice.call(args, 0);
 +    this.expected = this.args.slice(0);
 +
 +    this.args.unshift(this.actual);
 +
-     var matcher = matcherFactory(this.matchersUtil, this.customEqualityTesters);
++    // TODO: Remove support for passing customEqualityTesters in the next major release.
++    var matcher;
++
++    if (matcherFactory.length >= 2) {
++      matcher = matcherFactory(this.matchersUtil, this.customEqualityTesters);
++    } else {
++      matcher = matcherFactory(this.matchersUtil);
++    }
++
 +    var comparisonFunc = this.filters.selectComparisonFunc(matcher);
 +    return comparisonFunc || matcher.compare;
 +  };
 +
 +  Expector.prototype.buildMessage = function(result) {
 +    var self = this;
 +
 +    if (result.pass) {
 +      return '';
 +    }
 +
 +    var msg = this.filters.buildFailureMessage(
 +      result,
 +      this.matcherName,
 +      this.args,
 +      this.matchersUtil,
 +      defaultMessage
 +    );
 +    return this.filters.modifyFailureMessage(msg || defaultMessage());
 +
 +    function defaultMessage() {
 +      if (!result.message) {
 +        var args = self.args.slice();
 +        args.unshift(false);
 +        args.unshift(self.matcherName);
 +        return self.matchersUtil.buildFailureMessage.apply(
 +          self.matchersUtil,
 +          args
 +        );
 +      } else if (j$.isFunction_(result.message)) {
 +        return result.message();
 +      } else {
 +        return result.message;
 +      }
 +    }
 +  };
 +
 +  Expector.prototype.compare = function(matcherName, matcherFactory, args) {
 +    var matcherCompare = this.instantiateMatcher(
 +      matcherName,
 +      matcherFactory,
 +      args
 +    );
 +    return matcherCompare.apply(null, this.args);
 +  };
 +
 +  Expector.prototype.addFilter = function(filter) {
 +    var result = Object.create(this);
 +    result.filters = this.filters.addFilter(filter);
 +    return result;
 +  };
 +
 +  Expector.prototype.processResult = function(result, errorForStack) {
 +    var message = this.buildMessage(result);
 +
 +    if (this.expected.length === 1) {
 +      this.expected = this.expected[0];
 +    }
 +
 +    this.addExpectationResult(result.pass, {
 +      matcherName: this.matcherName,
 +      passed: result.pass,
 +      message: message,
 +      error: errorForStack ? undefined : result.error,
 +      errorForStack: errorForStack || undefined,
 +      actual: this.actual,
 +      expected: this.expected // TODO: this may need to be arrayified/sliced
 +    });
 +  };
 +
 +  return Expector;
 +};
 +
 +getJasmineRequireObj().formatErrorMsg = function() {
 +  function generateErrorMsg(domain, usage) {
 +    var usageDefinition = usage ? '\nUsage: ' + usage : '';
 +
 +    return function errorMsg(msg) {
 +      return domain + ' : ' + msg + usageDefinition;
 +    };
 +  }
 +
 +  return generateErrorMsg;
 +};
 +
 +getJasmineRequireObj().GlobalErrors = function(j$) {
 +  function GlobalErrors(global) {
 +    var handlers = [];
 +    global = global || j$.getGlobal();
 +
 +    var onerror = function onerror() {
 +      var handler = handlers[handlers.length - 1];
 +
 +      if (handler) {
 +        handler.apply(null, Array.prototype.slice.call(arguments, 0));
 +      } else {
 +        throw arguments[0];
 +      }
 +    };
 +
 +    this.originalHandlers = {};
 +    this.jasmineHandlers = {};
 +    this.installOne_ = function installOne_(errorType, jasmineMessage) {
 +      function taggedOnError(error) {
 +        var substituteMsg;
 +
 +        if (j$.isError_(error)) {
 +          error.jasmineMessage = jasmineMessage + ': ' + error;
 +        } else {
 +          if (error) {
 +            substituteMsg = jasmineMessage + ': ' + error;
 +          } else {
 +            substituteMsg = jasmineMessage + ' with no error or message';
 +          }
 +
 +          if (errorType === 'unhandledRejection') {
 +            substituteMsg +=
 +              '\n' +
 +              '(Tip: to get a useful stack trace, use ' +
 +              'Promise.reject(new Error(...)) instead of Promise.reject(' +
 +              (error ? '...' : '') +
 +              ').)';
 +          }
 +
 +          error = new Error(substituteMsg);
 +        }
 +
 +        var handler = handlers[handlers.length - 1];
 +
 +        if (handler) {
 +          handler(error);
 +        } else {
 +          throw error;
 +        }
 +      }
 +
 +      this.originalHandlers[errorType] = global.process.listeners(errorType);
 +      this.jasmineHandlers[errorType] = taggedOnError;
 +
 +      global.process.removeAllListeners(errorType);
 +      global.process.on(errorType, taggedOnError);
 +
 +      this.uninstall = function uninstall() {
 +        var errorTypes = Object.keys(this.originalHandlers);
 +        for (var iType = 0; iType < errorTypes.length; iType++) {
 +          var errorType = errorTypes[iType];
 +          global.process.removeListener(
 +            errorType,
 +            this.jasmineHandlers[errorType]
 +          );
 +          for (var i = 0; i < this.originalHandlers[errorType].length; i++) {
 +            global.process.on(errorType, this.originalHandlers[errorType][i]);
 +          }
 +          delete this.originalHandlers[errorType];
 +          delete this.jasmineHandlers[errorType];
 +        }
 +      };
 +    };
 +
 +    this.install = function install() {
 +      if (
 +        global.process &&
 +        global.process.listeners &&
 +        j$.isFunction_(global.process.on)
 +      ) {
 +        this.installOne_('uncaughtException', 'Uncaught exception');
 +        this.installOne_('unhandledRejection', 'Unhandled promise rejection');
 +      } else {
 +        var originalHandler = global.onerror;
 +        global.onerror = onerror;
 +
 +        var browserRejectionHandler = function browserRejectionHandler(event) {
 +          if (j$.isError_(event.reason)) {
 +            event.reason.jasmineMessage =
 +              'Unhandled promise rejection: ' + event.reason;
 +            global.onerror(event.reason);
 +          } else {
 +            global.onerror('Unhandled promise rejection: ' + event.reason);
 +          }
 +        };
 +
 +        if (global.addEventListener) {
 +          global.addEventListener(
 +            'unhandledrejection',
 +            browserRejectionHandler
 +          );
 +        }
 +
 +        this.uninstall = function uninstall() {
 +          global.onerror = originalHandler;
 +          if (global.removeEventListener) {
 +            global.removeEventListener(
 +              'unhandledrejection',
 +              browserRejectionHandler
 +            );
 +          }
 +        };
 +      }
 +    };
 +
 +    this.pushListener = function pushListener(listener) {
 +      handlers.push(listener);
 +    };
 +
 +    this.popListener = function popListener(listener) {
 +      if (!listener) {
 +        throw new Error('popListener expects a listener');
 +      }
 +
 +      handlers.pop();
 +    };
 +  }
 +
 +  return GlobalErrors;
 +};
 +
 +/* eslint-disable compat/compat */
 +getJasmineRequireObj().toBePending = function(j$) {
 +  /**
 +   * Expect a promise to be pending, i.e. the promise is neither resolved nor rejected.
 +   * @function
 +   * @async
 +   * @name async-matchers#toBePending
 +   * @since 3.6
 +   * @example
 +   * await expectAsync(aPromise).toBePending();
 +   */
 +  return function toBePending() {
 +    return {
 +      compare: function(actual) {
 +        if (!j$.isPromiseLike(actual)) {
 +          throw new Error('Expected toBePending to be called on a promise.');
 +        }
 +        var want = {};
 +        return Promise.race([actual, Promise.resolve(want)]).then(
 +          function(got) {
 +            return { pass: want === got };
 +          },
 +          function() {
 +            return { pass: false };
 +          }
 +        );
 +      }
 +    };
 +  };
 +};
 +
 +getJasmineRequireObj().toBeRejected = function(j$) {
 +  /**
 +   * Expect a promise to be rejected.
 +   * @function
 +   * @async
 +   * @name async-matchers#toBeRejected
 +   * @since 3.1.0
 +   * @example
 +   * await expectAsync(aPromise).toBeRejected();
 +   * @example
 +   * return expectAsync(aPromise).toBeRejected();
 +   */
 +  return function toBeRejected() {
 +    return {
 +      compare: function(actual) {
 +        if (!j$.isPromiseLike(actual)) {
 +          throw new Error('Expected toBeRejected to be called on a promise.');
 +        }
 +        return actual.then(
 +          function() {
 +            return { pass: false };
 +          },
 +          function() {
 +            return { pass: true };
 +          }
 +        );
 +      }
 +    };
 +  };
 +};
 +
 +getJasmineRequireObj().toBeRejectedWith = function(j$) {
 +  /**
 +   * Expect a promise to be rejected with a value equal to the expected, using deep equality comparison.
 +   * @function
 +   * @async
 +   * @name async-matchers#toBeRejectedWith
 +   * @since 3.3.0
 +   * @param {Object} expected - Value that the promise is expected to be rejected with
 +   * @example
 +   * await expectAsync(aPromise).toBeRejectedWith({prop: 'value'});
 +   * @example
 +   * return expectAsync(aPromise).toBeRejectedWith({prop: 'value'});
 +   */
 +  return function toBeRejectedWith(matchersUtil) {
 +    return {
 +      compare: function(actualPromise, expectedValue) {
 +        if (!j$.isPromiseLike(actualPromise)) {
 +          throw new Error(
 +            'Expected toBeRejectedWith to be called on a promise.'
 +          );
 +        }
 +
 +        function prefix(passed) {
 +          return (
 +            'Expected a promise ' +
 +            (passed ? 'not ' : '') +
 +            'to be rejected with ' +
 +            matchersUtil.pp(expectedValue)
 +          );
 +        }
 +
 +        return actualPromise.then(
 +          function() {
 +            return {
 +              pass: false,
 +              message: prefix(false) + ' but it was resolved.'
 +            };
 +          },
 +          function(actualValue) {
 +            if (matchersUtil.equals(actualValue, expectedValue)) {
 +              return {
 +                pass: true,
 +                message: prefix(true) + '.'
 +              };
 +            } else {
 +              return {
 +                pass: false,
 +                message:
 +                  prefix(false) +
 +                  ' but it was rejected with ' +
 +                  matchersUtil.pp(actualValue) +
 +                  '.'
 +              };
 +            }
 +          }
 +        );
 +      }
 +    };
 +  };
 +};
 +
 +getJasmineRequireObj().toBeRejectedWithError = function(j$) {
 +  /**
 +   * Expect a promise to be rejected with a value matched to the expected
 +   * @function
 +   * @async
 +   * @name async-matchers#toBeRejectedWithError
 +   * @since 3.5.0
 +   * @param {Error} [expected] - `Error` constructor the object that was thrown needs to be an instance of. If not provided, `Error` will be used.
 +   * @param {RegExp|String} [message] - The message that should be set on the thrown `Error`
 +   * @example
 +   * await expectAsync(aPromise).toBeRejectedWithError(MyCustomError, 'Error message');
 +   * await expectAsync(aPromise).toBeRejectedWithError(MyCustomError, /Error message/);
 +   * await expectAsync(aPromise).toBeRejectedWithError(MyCustomError);
 +   * await expectAsync(aPromise).toBeRejectedWithError('Error message');
 +   * return expectAsync(aPromise).toBeRejectedWithError(/Error message/);
 +   */
 +  return function toBeRejectedWithError(matchersUtil) {
 +    return {
 +      compare: function(actualPromise, arg1, arg2) {
 +        if (!j$.isPromiseLike(actualPromise)) {
 +          throw new Error(
 +            'Expected toBeRejectedWithError to be called on a promise.'
 +          );
 +        }
 +
 +        var expected = getExpectedFromArgs(arg1, arg2, matchersUtil);
 +
 +        return actualPromise.then(
 +          function() {
 +            return {
 +              pass: false,
 +              message: 'Expected a promise to be rejected but it was resolved.'
 +            };
 +          },
 +          function(actualValue) {
 +            return matchError(actualValue, expected, matchersUtil);
 +          }
 +        );
 +      }
 +    };
 +  };
 +
 +  function matchError(actual, expected, matchersUtil) {
 +    if (!j$.isError_(actual)) {
 +      return fail(expected, 'rejected with ' + matchersUtil.pp(actual));
 +    }
 +
 +    if (!(actual instanceof expected.error)) {
 +      return fail(
 +        expected,
 +        'rejected with type ' + j$.fnNameFor(actual.constructor)
 +      );
 +    }
 +
 +    var actualMessage = actual.message;
 +
 +    if (
 +      actualMessage === expected.message ||
 +      typeof expected.message === 'undefined'
 +    ) {
 +      return pass(expected);
 +    }
 +
 +    if (
 +      expected.message instanceof RegExp &&
 +      expected.message.test(actualMessage)
 +    ) {
 +      return pass(expected);
 +    }
 +
 +    return fail(expected, 'rejected with ' + matchersUtil.pp(actual));
 +  }
 +
 +  function pass(expected) {
 +    return {
 +      pass: true,
 +      message:
 +        'Expected a promise not to be rejected with ' +
 +        expected.printValue +
 +        ', but it was.'
 +    };
 +  }
 +
 +  function fail(expected, message) {
 +    return {
 +      pass: false,
 +      message:
 +        'Expected a promise to be rejected with ' +
 +        expected.printValue +
 +        ' but it was ' +
 +        message +
 +        '.'
 +    };
 +  }
 +
 +  function getExpectedFromArgs(arg1, arg2, matchersUtil) {
 +    var error, message;
 +
 +    if (isErrorConstructor(arg1)) {
 +      error = arg1;
 +      message = arg2;
 +    } else {
 +      error = Error;
 +      message = arg1;
 +    }
 +
 +    return {
 +      error: error,
 +      message: message,
 +      printValue:
 +        j$.fnNameFor(error) +
 +        (typeof message === 'undefined' ? '' : ': ' + matchersUtil.pp(message))
 +    };
 +  }
 +
 +  function isErrorConstructor(value) {
 +    return (
 +      typeof value === 'function' &&
 +      (value === Error || j$.isError_(value.prototype))
 +    );
 +  }
 +};
 +
 +getJasmineRequireObj().toBeResolved = function(j$) {
 +  /**
 +   * Expect a promise to be resolved.
 +   * @function
 +   * @async
 +   * @name async-matchers#toBeResolved
 +   * @since 3.1.0
 +   * @example
 +   * await expectAsync(aPromise).toBeResolved();
 +   * @example
 +   * return expectAsync(aPromise).toBeResolved();
 +   */
 +  return function toBeResolved(matchersUtil) {
 +    return {
 +      compare: function(actual) {
 +        if (!j$.isPromiseLike(actual)) {
 +          throw new Error('Expected toBeResolved to be called on a promise.');
 +        }
 +
 +        return actual.then(
 +          function() {
 +            return { pass: true };
 +          },
 +          function(e) {
 +            return {
 +              pass: false,
 +              message:
 +                'Expected a promise to be resolved but it was ' +
 +                'rejected with ' +
 +                matchersUtil.pp(e) +
 +                '.'
 +            };
 +          }
 +        );
 +      }
 +    };
 +  };
 +};
 +
 +getJasmineRequireObj().toBeResolvedTo = function(j$) {
 +  /**
 +   * Expect a promise to be resolved to a value equal to the expected, using deep equality comparison.
 +   * @function
 +   * @async
 +   * @name async-matchers#toBeResolvedTo
 +   * @since 3.1.0
 +   * @param {Object} expected - Value that the promise is expected to resolve to
 +   * @example
 +   * await expectAsync(aPromise).toBeResolvedTo({prop: 'value'});
 +   * @example
 +   * return expectAsync(aPromise).toBeResolvedTo({prop: 'value'});
 +   */
 +  return function toBeResolvedTo(matchersUtil) {
 +    return {
 +      compare: function(actualPromise, expectedValue) {
 +        if (!j$.isPromiseLike(actualPromise)) {
 +          throw new Error('Expected toBeResolvedTo to be called on a promise.');
 +        }
 +
 +        function prefix(passed) {
 +          return (
 +            'Expected a promise ' +
 +            (passed ? 'not ' : '') +
 +            'to be resolved to ' +
 +            matchersUtil.pp(expectedValue)
 +          );
 +        }
 +
 +        return actualPromise.then(
 +          function(actualValue) {
 +            if (matchersUtil.equals(actualValue, expectedValue)) {
 +              return {
 +                pass: true,
 +                message: prefix(true) + '.'
 +              };
 +            } else {
 +              return {
 +                pass: false,
 +                message:
 +                  prefix(false) +
 +                  ' but it was resolved to ' +
 +                  matchersUtil.pp(actualValue) +
 +                  '.'
 +              };
 +            }
 +          },
 +          function(e) {
 +            return {
 +              pass: false,
 +              message:
 +                prefix(false) +
 +                ' but it was rejected with ' +
 +                matchersUtil.pp(e) +
 +                '.'
 +            };
 +          }
 +        );
 +      }
 +    };
 +  };
 +};
 +
 +getJasmineRequireObj().DiffBuilder = function(j$) {
 +  return function DiffBuilder(config) {
 +    var prettyPrinter = (config || {}).prettyPrinter || j$.makePrettyPrinter(),
 +      mismatches = new j$.MismatchTree(),
 +      path = new j$.ObjectPath(),
 +      actualRoot = undefined,
 +      expectedRoot = undefined;
 +
 +    return {
 +      setRoots: function(actual, expected) {
 +        actualRoot = actual;
 +        expectedRoot = expected;
 +      },
 +
 +      recordMismatch: function(formatter) {
 +        mismatches.add(path, formatter);
 +      },
 +
 +      getMessage: function() {
 +        var messages = [];
 +
 +        mismatches.traverse(function(path, isLeaf, formatter) {
 +          var actualCustom,
 +            expectedCustom,
 +            useCustom,
 +            derefResult = dereferencePath(
 +              path,
 +              actualRoot,
 +              expectedRoot,
 +              prettyPrinter
 +            ),
 +            actual = derefResult.actual,
 +            expected = derefResult.expected;
 +
 +          if (formatter) {
 +            messages.push(formatter(actual, expected, path, prettyPrinter));
 +            return true;
 +          }
 +
 +          actualCustom = prettyPrinter.customFormat_(actual);
 +          expectedCustom = prettyPrinter.customFormat_(expected);
 +          useCustom = !(
 +            j$.util.isUndefined(actualCustom) &&
 +            j$.util.isUndefined(expectedCustom)
 +          );
 +
 +          if (useCustom) {
 +            messages.push(
 +              wrapPrettyPrinted(actualCustom, expectedCustom, path)
 +            );
 +            return false; // don't recurse further
 +          }
 +
 +          if (isLeaf) {
 +            messages.push(
 +              defaultFormatter(actual, expected, path, prettyPrinter)
 +            );
 +          }
 +
 +          return true;
 +        });
 +
 +        return messages.join('\n');
 +      },
 +
 +      withPath: function(pathComponent, block) {
 +        var oldPath = path;
 +        path = path.add(pathComponent);
 +        block();
 +        path = oldPath;
 +      }
 +    };
 +
 +    function defaultFormatter(actual, expected, path, prettyPrinter) {
 +      return wrapPrettyPrinted(
 +        prettyPrinter(actual),
 +        prettyPrinter(expected),
 +        path
 +      );
 +    }
 +
 +    function wrapPrettyPrinted(actual, expected, path) {
 +      return (
 +        'Expected ' +
 +        path +
 +        (path.depth() ? ' = ' : '') +
 +        actual +
 +        ' to equal ' +
 +        expected +
 +        '.'
 +      );
 +    }
 +  };
 +
 +  function dereferencePath(objectPath, actual, expected, pp) {
 +    function handleAsymmetricExpected() {
 +      if (
 +        j$.isAsymmetricEqualityTester_(expected) &&
 +        j$.isFunction_(expected.valuesForDiff_)
 +      ) {
 +        var asymmetricResult = expected.valuesForDiff_(actual, pp);
 +        expected = asymmetricResult.self;
 +        actual = asymmetricResult.other;
 +      }
 +    }
 +
 +    var i;
 +    handleAsymmetricExpected();
 +
 +    for (i = 0; i < objectPath.components.length; i++) {
 +      actual = actual[objectPath.components[i]];
 +      expected = expected[objectPath.components[i]];
 +      handleAsymmetricExpected();
 +    }
 +
 +    return { actual: actual, expected: expected };
 +  }
 +};
 +
 +getJasmineRequireObj().MatchersUtil = function(j$) {
-   // TODO: convert all uses of j$.pp to use the injected pp
- 
 +  /**
 +   * @class MatchersUtil
 +   * @classdesc Utilities for use in implementing matchers.<br>
 +   * _Note:_ Do not construct this directly. Jasmine will construct one and
 +   * pass it to matchers and asymmetric equality testers.
 +   * @hideconstructor
 +   */
 +  function MatchersUtil(options) {
 +    options = options || {};
 +    this.customTesters_ = options.customTesters || [];
 +    /**
 +     * Formats a value for use in matcher failure messages and similar contexts,
 +     * taking into account the current set of custom value formatters.
 +     * @function
 +     * @name MatchersUtil#pp
 +     * @since 3.6.0
 +     * @param {*} value The value to pretty-print
 +     * @return {string} The pretty-printed value
 +     */
 +    this.pp = options.pp || function() {};
 +  }
 +
 +  /**
 +   * Determines whether `haystack` contains `needle`, using the same comparison
 +   * logic as {@link MatchersUtil#equals}.
 +   * @function
 +   * @name MatchersUtil#contains
 +   * @since 2.0.0
 +   * @param {*} haystack The collection to search
 +   * @param {*} needle The value to search for
-    * @param [customTesters] An array of custom equality testers
++   * @param [customTesters] An array of custom equality testers. Deprecated.
++   * As of 3.6 this parameter no longer needs to be passed. It will be removed in 4.0.
 +   * @returns {boolean} True if `needle` was found in `haystack`
 +   */
 +  MatchersUtil.prototype.contains = function(haystack, needle, customTesters) {
++    if (customTesters) {
++      j$.getEnv().deprecated(
++        'Passing custom equality testers ' +
++          'to MatchersUtil#contains is deprecated. ' +
++          'See <https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#matchers-cet> for details.'
++      );
++    }
++
 +    if (j$.isSet(haystack)) {
 +      return haystack.has(needle);
 +    }
 +
 +    if (
 +      Object.prototype.toString.apply(haystack) === '[object Array]' ||
 +      (!!haystack && !haystack.indexOf)
 +    ) {
 +      for (var i = 0; i < haystack.length; i++) {
-         if (this.equals(haystack[i], needle, customTesters)) {
-           return true;
++        try {
++          this.suppressDeprecation_ = true;
++          if (this.equals(haystack[i], needle, customTesters)) {
++            return true;
++          }
++        } finally {
++          this.suppressDeprecation_ = false;
 +        }
 +      }
 +      return false;
 +    }
 +
 +    return !!haystack && haystack.indexOf(needle) >= 0;
 +  };
 +
 +  MatchersUtil.prototype.buildFailureMessage = function() {
 +    var self = this;
 +    var args = Array.prototype.slice.call(arguments, 0),
 +      matcherName = args[0],
 +      isNot = args[1],
 +      actual = args[2],
 +      expected = args.slice(3),
 +      englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) {
 +        return ' ' + s.toLowerCase();
 +      });
 +
 +    var message =
 +      'Expected ' +
 +      self.pp(actual) +
 +      (isNot ? ' not ' : ' ') +
 +      englishyPredicate;
 +
 +    if (expected.length > 0) {
 +      for (var i = 0; i < expected.length; i++) {
 +        if (i > 0) {
 +          message += ',';
 +        }
 +        message += ' ' + self.pp(expected[i]);
 +      }
 +    }
 +
 +    return message + '.';
 +  };
 +
 +  MatchersUtil.prototype.asymmetricDiff_ = function(
 +    a,
 +    b,
 +    aStack,
 +    bStack,
 +    customTesters,
 +    diffBuilder
 +  ) {
 +    if (j$.isFunction_(b.valuesForDiff_)) {
 +      var values = b.valuesForDiff_(a, this.pp);
 +      this.eq_(
 +        values.other,
 +        values.self,
 +        aStack,
 +        bStack,
 +        customTesters,
 +        diffBuilder
 +      );
 +    } else {
 +      diffBuilder.recordMismatch();
 +    }
 +  };
 +
 +  MatchersUtil.prototype.asymmetricMatch_ = function(
 +    a,
 +    b,
 +    aStack,
 +    bStack,
 +    customTesters,
 +    diffBuilder
 +  ) {
 +    var asymmetricA = j$.isAsymmetricEqualityTester_(a),
 +      asymmetricB = j$.isAsymmetricEqualityTester_(b),
 +      shim,
 +      result;
 +
 +    if (asymmetricA === asymmetricB) {
 +      return undefined;
 +    }
 +
 +    shim = j$.asymmetricEqualityTesterArgCompatShim(this, customTesters);
 +
 +    if (asymmetricA) {
 +      result = a.asymmetricMatch(b, shim);
 +      if (!result) {
 +        diffBuilder.recordMismatch();
 +      }
 +      return result;
 +    }
 +
 +    if (asymmetricB) {
 +      result = b.asymmetricMatch(a, shim);
 +      if (!result) {
 +        this.asymmetricDiff_(a, b, aStack, bStack, customTesters, diffBuilder);
 +      }
 +      return result;
 +    }
 +  };
 +
 +  /**
 +   * Determines whether two values are deeply equal to each other.
 +   * @function
 +   * @name MatchersUtil#equals
 +   * @since 2.0.0
 +   * @param {*} a The first value to compare
 +   * @param {*} b The second value to compare
-    * @param [customTesters] An array of custom equality testers
++   * @param [customTesters] An array of custom equality testers. Deprecated.
++   * As of 3.6 this parameter no longer needs to be passed. It will be removed in 4.0.
 +   * @returns {boolean} True if the values are equal
 +   */
 +  MatchersUtil.prototype.equals = function(
 +    a,
 +    b,
 +    customTestersOrDiffBuilder,
 +    diffBuilderOrNothing
 +  ) {
 +    var customTesters, diffBuilder;
 +
 +    if (isDiffBuilder(customTestersOrDiffBuilder)) {
 +      diffBuilder = customTestersOrDiffBuilder;
 +    } else {
++      if (customTestersOrDiffBuilder && !this.suppressDeprecation_) {
++        j$.getEnv().deprecated(
++          'Passing custom equality testers ' +
++            'to MatchersUtil#equals is deprecated. ' +
++            'See <https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#matchers-cet> for details.'
++        );
++      }
++
++      if (diffBuilderOrNothing) {
++        j$.getEnv().deprecated(
++          'Diff builder should be passed ' +
++            'as the third argument to MatchersUtil#equals, not the fourth. ' +
++            'See <https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#matchers-cet> for details.'
++        );
++      }
++
 +      customTesters = customTestersOrDiffBuilder;
 +      diffBuilder = diffBuilderOrNothing;
 +    }
 +
 +    customTesters = customTesters || this.customTesters_;
 +    diffBuilder = diffBuilder || j$.NullDiffBuilder();
 +    diffBuilder.setRoots(a, b);
 +
 +    return this.eq_(a, b, [], [], customTesters, diffBuilder);
 +  };
 +
 +  // Equality function lovingly adapted from isEqual in
 +  //   [Underscore](http://underscorejs.org)
 +  MatchersUtil.prototype.eq_ = function(
 +    a,
 +    b,
 +    aStack,
 +    bStack,
 +    customTesters,
 +    diffBuilder
 +  ) {
 +    var result = true,
 +      self = this,
 +      i;
 +
 +    var asymmetricResult = this.asymmetricMatch_(
 +      a,
 +      b,
 +      aStack,
 +      bStack,
 +      customTesters,
 +      diffBuilder
 +    );
 +    if (!j$.util.isUndefined(asymmetricResult)) {
 +      return asymmetricResult;
 +    }
 +
 +    for (i = 0; i < customTesters.length; i++) {
 +      var customTesterResult = customTesters[i](a, b);
 +      if (!j$.util.isUndefined(customTesterResult)) {
 +        if (!customTesterResult) {
 +          diffBuilder.recordMismatch();
 +        }
 +        return customTesterResult;
 +      }
 +    }
 +
 +    if (a instanceof Error && b instanceof Error) {
 +      result = a.message == b.message;
 +      if (!result) {
 +        diffBuilder.recordMismatch();
 +      }
 +      return result;
 +    }
 +
 +    // Identical objects are equal. `0 === -0`, but they aren't identical.
 +    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
 +    if (a === b) {
 +      result = a !== 0 || 1 / a == 1 / b;
 +      if (!result) {
 +        diffBuilder.recordMismatch();
 +      }
 +      return result;
 +    }
 +    // A strict comparison is necessary because `null == undefined`.
 +    if (a === null || b === null) {
 +      result = a === b;
 +      if (!result) {
 +        diffBuilder.recordMismatch();
 +      }
 +      return result;
 +    }
 +    var className = Object.prototype.toString.call(a);
 +    if (className != Object.prototype.toString.call(b)) {
 +      diffBuilder.recordMismatch();
 +      return false;
 +    }
 +    switch (className) {
 +      // Strings, numbers, dates, and booleans are compared by value.
 +      case '[object String]':
 +        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
 +        // equivalent to `new String("5")`.
 +        result = a == String(b);
 +        if (!result) {
 +          diffBuilder.recordMismatch();
 +        }
 +        return result;
 +      case '[object Number]':
 +        // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
 +        // other numeric values.
 +        result =
 +          a != +a ? b != +b : a === 0 && b === 0 ? 1 / a == 1 / b : a == +b;
 +        if (!result) {
 +          diffBuilder.recordMismatch();
 +        }
 +        return result;
 +      case '[object Date]':
 +      case '[object Boolean]':
 +        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
 +        // millisecond representations. Note that invalid dates with millisecond representations
 +        // of `NaN` are not equivalent.
 +        result = +a == +b;
 +        if (!result) {
 +          diffBuilder.recordMismatch();
 +        }
 +        return result;
 +      case '[object ArrayBuffer]':
 +        // If we have an instance of ArrayBuffer the Uint8Array ctor
 +        // will be defined as well
 +        return self.eq_(
 +          new Uint8Array(a), // eslint-disable-line compat/compat
 +          new Uint8Array(b), // eslint-disable-line compat/compat
 +          aStack,
 +          bStack,
 +          customTesters,
 +          diffBuilder
 +        );
 +      // RegExps are compared by their source patterns and flags.
 +      case '[object RegExp]':
 +        return (
 +          a.source == b.source &&
 +          a.global == b.global &&
 +          a.multiline == b.multiline &&
 +          a.ignoreCase == b.ignoreCase
 +        );
 +    }
 +    if (typeof a != 'object' || typeof b != 'object') {
 +      diffBuilder.recordMismatch();
 +      return false;
 +    }
 +
 +    var aIsDomNode = j$.isDomNode(a);
 +    var bIsDomNode = j$.isDomNode(b);
 +    if (aIsDomNode && bIsDomNode) {
 +      // At first try to use DOM3 method isEqualNode
 +      result = a.isEqualNode(b);
 +      if (!result) {
 +        diffBuilder.recordMismatch();
 +      }
 +      return result;
 +    }
 +    if (aIsDomNode || bIsDomNode) {
 +      diffBuilder.recordMismatch();
 +      return false;
 +    }
 +
 +    var aIsPromise = j$.isPromise(a);
 +    var bIsPromise = j$.isPromise(b);
 +    if (aIsPromise && bIsPromise) {
 +      return a === b;
 +    }
 +
 +    // Assume equality for cyclic structures. The algorithm for detecting cyclic
 +    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
 +    var length = aStack.length;
 +    while (length--) {
 +      // Linear search. Performance is inversely proportional to the number of
 +      // unique nested structures.
 +      if (aStack[length] == a) {
 +        return bStack[length] == b;
 +      }
 +    }
 +    // Add the first object to the stack of traversed objects.
 +    aStack.push(a);
 +    bStack.push(b);
 +    var size = 0;
 +    // Recursively compare objects and arrays.
 +    // Compare array lengths to determine if a deep comparison is necessary.
 +    if (className == '[object Array]') {
 +      var aLength = a.length;
 +      var bLength = b.length;
 +
 +      diffBuilder.withPath('length', function() {
 +        if (aLength !== bLength) {
 +          diffBuilder.recordMismatch();
 +          result = false;
 +        }
 +      });
 +
 +      for (i = 0; i < aLength || i < bLength; i++) {
 +        diffBuilder.withPath(i, function() {
 +          if (i >= bLength) {
 +            diffBuilder.recordMismatch(
 +              actualArrayIsLongerFormatter.bind(null, self.pp)
 +            );
 +            result = false;
 +          } else {
 +            result =
 +              self.eq_(
 +                i < aLength ? a[i] : void 0,
 +                i < bLength ? b[i] : void 0,
 +                aStack,
 +                bStack,
 +                customTesters,
 +                diffBuilder
 +              ) && result;
 +          }
 +        });
 +      }
 +      if (!result) {
 +        return false;
 +      }
 +    } else if (j$.isMap(a) && j$.isMap(b)) {
 +      if (a.size != b.size) {
 +        diffBuilder.recordMismatch();
 +        return false;
 +      }
 +
 +      var keysA = [];
 +      var keysB = [];
 +      a.forEach(function(valueA, keyA) {
 +        keysA.push(keyA);
 +      });
 +      b.forEach(function(valueB, keyB) {
 +        keysB.push(keyB);
 +      });
 +
 +      // For both sets of keys, check they map to equal values in both maps.
 +      // Keep track of corresponding keys (in insertion order) in order to handle asymmetric obj keys.
 +      var mapKeys = [keysA, keysB];
 +      var cmpKeys = [keysB, keysA];
 +      var mapIter, mapKey, mapValueA, mapValueB;
 +      var cmpIter, cmpKey;
 +      for (i = 0; result && i < mapKeys.length; i++) {
 +        mapIter = mapKeys[i];
 +        cmpIter = cmpKeys[i];
 +
 +        for (var j = 0; result && j < mapIter.length; j++) {
 +          mapKey = mapIter[j];
 +          cmpKey = cmpIter[j];
 +          mapValueA = a.get(mapKey);
 +
 +          // Only use the cmpKey when one of the keys is asymmetric and the corresponding key matches,
 +          // otherwise explicitly look up the mapKey in the other Map since we want keys with unique
 +          // obj identity (that are otherwise equal) to not match.
 +          if (
 +            j$.isAsymmetricEqualityTester_(mapKey) ||
 +            (j$.isAsymmetricEqualityTester_(cmpKey) &&
 +              this.eq_(
 +                mapKey,
 +                cmpKey,
 +                aStack,
 +                bStack,
 +                customTesters,
 +                j$.NullDiffBuilder()
 +              ))
 +          ) {
 +            mapValueB = b.get(cmpKey);
 +          } else {
 +            mapValueB = b.get(mapKey);
 +          }
 +          result = this.eq_(
 +            mapValueA,
 +            mapValueB,
 +            aStack,
 +            bStack,
 +            customTesters,
 +            j$.NullDiffBuilder()
 +          );
 +        }
 +      }
 +
 +      if (!result) {
 +        diffBuilder.recordMismatch();
 +        return false;
 +      }
 +    } else if (j$.isSet(a) && j$.isSet(b)) {
 +      if (a.size != b.size) {
 +        diffBuilder.recordMismatch();
 +        return false;
 +      }
 +
 +      var valuesA = [];
 +      a.forEach(function(valueA) {
 +        valuesA.push(valueA);
 +      });
 +      var valuesB = [];
 +      b.forEach(function(valueB) {
 +        valuesB.push(valueB);
 +      });
 +
 +      // For both sets, check they are all contained in the other set
 +      var setPairs = [[valuesA, valuesB], [valuesB, valuesA]];
 +      var stackPairs = [[aStack, bStack], [bStack, aStack]];
 +      var baseValues, baseValue, baseStack;
 +      var otherValues, otherValue, otherStack;
 +      var found;
 +      var prevStackSize;
 +      for (i = 0; result && i < setPairs.length; i++) {
 +        baseValues = setPairs[i][0];
 +        otherValues = setPairs[i][1];
 +        baseStack = stackPairs[i][0];
 +        otherStack = stackPairs[i][1];
 +        // For each value in the base set...
 +        for (var k = 0; result && k < baseValues.length; k++) {
 +          baseValue = baseValues[k];
 +          found = false;
 +          // ... test that it is present in the other set
 +          for (var l = 0; !found && l < otherValues.length; l++) {
 +            otherValue = otherValues[l];
 +            prevStackSize = baseStack.length;
 +            // compare by value equality
 +            found = this.eq_(
 +              baseValue,
 +              otherValue,
 +              baseStack,
 +              otherStack,
 +              customTesters,
 +              j$.NullDiffBuilder()
 +            );
 +            if (!found && prevStackSize !== baseStack.length) {
 +              baseStack.splice(prevStackSize);
 +              otherStack.splice(prevStackSize);
 +            }
 +          }
 +          result = result && found;
 +        }
 +      }
 +
 +      if (!result) {
 +        diffBuilder.recordMismatch();
 +        return false;
 +      }
 +    } else if (j$.isURL(a) && j$.isURL(b)) {
 +      // URLs have no enumrable properties, so the default object comparison
 +      // would consider any two URLs to be equal.
 +      return a.toString() === b.toString();
 +    } else {
 +      // Objects with different constructors are not equivalent, but `Object`s
 +      // or `Array`s from different frames are.
 +      var aCtor = a.constructor,
 +        bCtor = b.constructor;
 +      if (
 +        aCtor !== bCtor &&
 +        isFunction(aCtor) &&
 +        isFunction(bCtor) &&
 +        a instanceof aCtor &&
 +        b instanceof bCtor &&
 +        !(aCtor instanceof aCtor && bCtor instanceof bCtor)
 +      ) {
 +        diffBuilder.recordMismatch(
 +          constructorsAreDifferentFormatter.bind(null, this.pp)
 +        );
 +        return false;
 +      }
 +    }
 +
 +    // Deep compare objects.
 +    var aKeys = keys(a, className == '[object Array]'),
 +      key;
 +    size = aKeys.length;
 +
 +    // Ensure that both objects contain the same number of properties before comparing deep equality.
 +    if (keys(b, className == '[object Array]').length !== size) {
 +      diffBuilder.recordMismatch(
 +        objectKeysAreDifferentFormatter.bind(null, this.pp)
 +      );
 +      return false;
 +    }
 +
 +    for (i = 0; i < size; i++) {
 +      key = aKeys[i];
 +      // Deep compare each member
 +      if (!j$.util.has(b, key)) {
 +        diffBuilder.recordMismatch(
 +          objectKeysAreDifferentFormatter.bind(null, this.pp)
 +        );
 +        result = false;
 +        continue;
 +      }
 +
 +      diffBuilder.withPath(key, function() {
 +        if (
 +          !self.eq_(a[key], b[key], aStack, bStack, customTesters, diffBuilder)
 +        ) {
 +          result = false;
 +        }
 +      });
 +    }
 +
 +    if (!result) {
 +      return false;
 +    }
 +
 +    // Remove the first object from the stack of traversed objects.
 +    aStack.pop();
 +    bStack.pop();
 +
 +    return result;
 +  };
 +
 +  function keys(obj, isArray) {
 +    var allKeys = Object.keys
 +      ? Object.keys(obj)
 +      : (function(o) {
 +          var keys = [];
 +          for (var key in o) {
 +            if (j$.util.has(o, key)) {
 +              keys.push(key);
 +            }
 +          }
 +          return keys;
 +        })(obj);
 +
 +    if (!isArray) {
 +      return allKeys;
 +    }
 +
 +    if (allKeys.length === 0) {
 +      return allKeys;
 +    }
 +
 +    var extraKeys = [];
 +    for (var i = 0; i < allKeys.length; i++) {
 +      if (!/^[0-9]+$/.test(allKeys[i])) {
 +        extraKeys.push(allKeys[i]);
 +      }
 +    }
 +
 +    return extraKeys;
 +  }
 +
 +  function isFunction(obj) {
 +    return typeof obj === 'function';
 +  }
 +
 +  function objectKeysAreDifferentFormatter(pp, actual, expected, path) {
 +    var missingProperties = j$.util.objectDifference(expected, actual),
 +      extraProperties = j$.util.objectDifference(actual, expected),
 +      missingPropertiesMessage = formatKeyValuePairs(pp, missingProperties),
 +      extraPropertiesMessage = formatKeyValuePairs(pp, extraProperties),
 +      messages = [];
 +
 +    if (!path.depth()) {
 +      path = 'object';
 +    }
 +
 +    if (missingPropertiesMessage.length) {
 +      messages.push(
 +        'Expected ' + path + ' to have properties' + missingPropertiesMessage
 +      );
 +    }
 +
 +    if (extraPropertiesMessage.length) {
 +      messages.push(
 +        'Expected ' + path + ' not to have properties' + extraPropertiesMessage
 +      );
 +    }
 +
 +    return messages.join('\n');
 +  }
 +
 +  function constructorsAreDifferentFormatter(pp, actual, expected, path) {
 +    if (!path.depth()) {
 +      path = 'object';
 +    }
 +
 +    return (
 +      'Expected ' +
 +      path +
 +      ' to be a kind of ' +
 +      j$.fnNameFor(expected.constructor) +
 +      ', but was ' +
 +      pp(actual) +
 +      '.'
 +    );
 +  }
 +
 +  function actualArrayIsLongerFormatter(pp, actual, expected, path) {
 +    return (
 +      'Unexpected ' +
 +      path +
 +      (path.depth() ? ' = ' : '') +
 +      pp(actual) +
 +      ' in array.'
 +    );
 +  }
 +
 +  function formatKeyValuePairs(pp, obj) {
 +    var formatted = '';
 +    for (var key in obj) {
 +      formatted += '\n    ' + key + ': ' + pp(obj[key]);
 +    }
 +    return formatted;
 +  }
 +
 +  function isDiffBuilder(obj) {
 +    return obj && typeof obj.recordMismatch === 'function';
 +  }
 +
 +  return MatchersUtil;
 +};
 +
 +/**
 + * @interface AsymmetricEqualityTester
 + * @classdesc An asymmetric equality tester is an object that can match multiple
 + * objects. Examples include jasmine.any() and jasmine.stringMatching(). Jasmine
 + * includes a number of built-in asymmetric equality testers, such as
 + * {@link jasmine.objectContaining}. User-defined asymmetric equality testers are
 + * also supported.
 + *
 + * Asymmetric equality testers work with any matcher, including user-defined
 + * custom matchers, that uses {@link MatchersUtil#equals} or
 + * {@link MatchersUtil#contains}.
 + *
 + * @example
 + * function numberDivisibleBy(divisor) {
 + *   return {
 + *     asymmetricMatch: function(n) {
 + *       return typeof n === 'number' && n % divisor === 0;
 + *     },
 + *     jasmineToString: function() {
 + *       return `<a number divisible by ${divisor}>`;
 + *     }
 + *   };
 + * }
 + *
 + * var actual = {
 + *   n: 2,
 + *   otherFields: "don't care"
 + * };
 + *
 + * expect(actual).toEqual(jasmine.objectContaining({n: numberDivisibleBy(2)}));
 + * @see custom_asymmetric_equality_testers
 + * @since 2.0.0
 + */
 +/**
 + * Determines whether a value matches this tester
 + * @function
 + * @name AsymmetricEqualityTester#asymmetricMatch
 + * @param value {any} The value to test
 + * @param matchersUtil {MatchersUtil} utilities for testing equality, etc
 + * @return {Boolean}
 + */
 +/**
 + * Returns a string representation of this tester to use in matcher failure messages
 + * @function
 + * @name AsymmetricEqualityTester#jasmineToString
 + * @param pp {function} Function that takes a value and returns a pretty-printed representation
 + * @return {String}
 + */
 +
 +getJasmineRequireObj().MismatchTree = function(j$) {
 +  /*
 +    To be able to apply custom object formatters at all possible levels of an
 +    object graph, DiffBuilder needs to be able to know not just where the
 +    mismatch occurred but also all ancestors of the mismatched value in both
 +    the expected and actual object graphs. MismatchTree maintains that context
 +    and provides it via the traverse method.
 +   */
 +  function MismatchTree(path) {
 +    this.path = path || new j$.ObjectPath([]);
 +    this.formatter = undefined;
 +    this.children = [];
 +    this.isMismatch = false;
 +  }
 +
 +  MismatchTree.prototype.add = function(path, formatter) {
 +    var key, child;
 +
 +    if (path.depth() === 0) {
 +      this.formatter = formatter;
 +      this.isMismatch = true;
 +    } else {
 +      key = path.components[0];
 +      path = path.shift();
 +      child = this.child(key);
 +
 +      if (!child) {
 +        child = new MismatchTree(this.path.add(key));
 +        this.children.push(child);
 +      }
 +
 +      child.add(path, formatter);
 +    }
 +  };
 +
 +  MismatchTree.prototype.traverse = function(visit) {
 +    var i,
 +      hasChildren = this.children.length > 0;
 +
 +    if (this.isMismatch || hasChildren) {
 +      if (visit(this.path, !hasChildren, this.formatter)) {
 +        for (i = 0; i < this.children.length; i++) {
 +          this.children[i].traverse(visit);
 +        }
 +      }
 +    }
 +  };
 +
 +  MismatchTree.prototype.child = function(key) {
 +    var i, pathEls;
 +
 +    for (i = 0; i < this.children.length; i++) {
 +      pathEls = this.children[i].path.components;
 +      if (pathEls[pathEls.length - 1] === key) {
 +        return this.children[i];
 +      }
 +    }
 +  };
 +
 +  return MismatchTree;
 +};
 +
 +getJasmineRequireObj().nothing = function() {
 +  /**
 +   * {@link expect} nothing explicitly.
 +   * @function
 +   * @name matchers#nothing
 +   * @since 2.8.0
 +   * @example
 +   * expect().nothing();
 +   */
 +  function nothing() {
 +    return {
 +      compare: function() {
 +        return {
 +          pass: true
 +        };
 +      }
 +    };
 +  }
 +
 +  return nothing;
 +};
 +
 +getJasmineRequireObj().NullDiffBuilder = function(j$) {
 +  return function() {
 +    return {
 +      withPath: function(_, block) {
 +        block();
 +      },
 +      setRoots: function() {},
 +      recordMismatch: function() {}
 +    };
 +  };
 +};
 +
 +getJasmineRequireObj().ObjectPath = function(j$) {
 +  function ObjectPath(components) {
 +    this.components = components || [];
 +  }
 +
 +  ObjectPath.prototype.toString = function() {
 +    if (this.components.length) {
 +      return '$' + map(this.components, formatPropertyAccess).join('');
 +    } else {
 +      return '';
 +    }
 +  };
 +
 +  ObjectPath.prototype.add = function(component) {
 +    return new ObjectPath(this.components.concat([component]));
 +  };
 +
 +  ObjectPath.prototype.shift = function() {
 +    return new ObjectPath(this.components.slice(1));
 +  };
 +
 +  ObjectPath.prototype.depth = function() {
 +    return this.components.length;
 +  };
 +
 +  function formatPropertyAccess(prop) {
 +    if (typeof prop === 'number') {
 +      return '[' + prop + ']';
 +    }
 +
 +    if (isValidIdentifier(prop)) {
 +      return '.' + prop;
 +    }
 +
 +    return "['" + prop + "']";
 +  }
 +
 +  function map(array, fn) {
 +    var results = [];
 +    for (var i = 0; i < array.length; i++) {
 +      results.push(fn(array[i]));
 +    }
 +    return results;
 +  }
 +
 +  function isValidIdentifier(string) {
 +    return /^[A-Za-z\$_][A-Za-z0-9\$_]*$/.test(string);
 +  }
 +
 +  return ObjectPath;
 +};
 +
 +getJasmineRequireObj().requireAsyncMatchers = function(jRequire, j$) {
 +  var availableMatchers = [
 +      'toBePending',
 +      'toBeResolved',
 +      'toBeRejected',
 +      'toBeResolvedTo',
 +      'toBeRejectedWith',
 +      'toBeRejectedWithError'
 +    ],
 +    matchers = {};
 +
 +  for (var i = 0; i < availableMatchers.length; i++) {
 +    var name = availableMatchers[i];
 +    matchers[name] = jRequire[name](j$);
 +  }
 +
 +  return matchers;
 +};
 +
 +getJasmineRequireObj().toBe = function(j$) {
 +  /**
 +   * {@link expect} the actual value to be `===` to the expected value.
 +   * @function
 +   * @name matchers#toBe
 +   * @since 1.3.0
 +   * @param {Object} expected - The expected value to compare against.
 +   * @example
 +   * expect(thing).toBe(realThing);
 +   */
 +  function toBe(matchersUtil) {
 +    var tip =
 +      ' Tip: To check for deep equality, use .toEqual() instead of .toBe().';
 +
 +    return {
 +      compare: function(actual, expected) {
 +        var result = {
 +          pass: actual === expected
 +        };
 +
 +        if (typeof expected === 'object') {
 +          result.message =
 +            matchersUtil.buildFailureMessage(
 +              'toBe',
 +              result.pass,
 +              actual,
 +              expected
 +            ) + tip;
 +        }
 +
 +        return result;
 +      }
 +    };
 +  }
 +
 +  return toBe;
 +};
 +
 +getJasmineRequireObj().toBeCloseTo = function() {
 +  /**
 +   * {@link expect} the actual value to be within a specified precision of the expected value.
 +   * @function
 +   * @name matchers#toBeCloseTo
 +   * @since 1.3.0
 +   * @param {Object} expected - The expected value to compare against.
 +   * @param {Number} [precision=2] - The number of decimal points to check.
 +   * @example
 +   * expect(number).toBeCloseTo(42.2, 3);
 +   */
 +  function toBeCloseTo() {
 +    return {
 +      compare: function(actual, expected, precision) {
 +        if (precision !== 0) {
 +          precision = precision || 2;
 +        }
 +
 +        if (expected === null || actual === null) {
 +          throw new Error(
 +            'Cannot use toBeCloseTo with null. Arguments evaluated to: ' +
 +              'expect(' +
 +              actual +
 +              ').toBeCloseTo(' +
 +              expected +
 +              ').'
 +          );
 +        }
 +
 +        var pow = Math.pow(10, precision + 1);
 +        var delta = Math.abs(expected - actual);
 +        var maxDelta = Math.pow(10, -precision) / 2;
 +
 +        return {
 +          pass: Math.round(delta * pow) <= maxDelta * pow
 +        };
 +      }
 +    };
 +  }
 +
 +  return toBeCloseTo;
 +};
 +
 +getJasmineRequireObj().toBeDefined = function() {
 +  /**
 +   * {@link expect} the actual value to be defined. (Not `undefined`)
 +   * @function
 +   * @name matchers#toBeDefined
 +   * @since 1.3.0
 +   * @example
 +   * expect(result).toBeDefined();
 +   */
 +  function toBeDefined() {
 +    return {
 +      compare: function(actual) {
 +        return {
 +          pass: void 0 !== actual
 +        };
 +      }
 +    };
 +  }
 +
 +  return toBeDefined;
 +};
 +
 +getJasmineRequireObj().toBeFalse = function() {
 +  /**
 +   * {@link expect} the actual value to be `false`.
 +   * @function
 +   * @name matchers#toBeFalse
 +   * @since 3.5.0
 +   * @example
 +   * expect(result).toBeFalse();
 +   */
 +  function toBeFalse() {
 +    return {
 +      compare: function(actual) {
 +        return {
 +          pass: actual === false
 +        };
 +      }
 +    };
 +  }
 +
 +  return toBeFalse;
 +};
 +
 +getJasmineRequireObj().toBeFalsy = function() {
 +  /**
 +   * {@link expect} the actual value to be falsy
 +   * @function
 +   * @name matchers#toBeFalsy
 +   * @since 2.0.0
 +   * @example
 +   * expect(result).toBeFalsy();
 +   */
 +  function toBeFalsy() {
 +    return {
 +      compare: function(actual) {
 +        return {
 +          pass: !actual
 +        };
 +      }
 +    };
 +  }
 +
 +  return toBeFalsy;
 +};
 +
 +getJasmineRequireObj().toBeGreaterThan = function() {
 +  /**
 +   * {@link expect} the actual value to be greater than the expected value.
 +   * @function
 +   * @name matchers#toBeGreaterThan
 +   * @since 2.0.0
 +   * @param {Number} expected - The value to compare against.
 +   * @example
 +   * expect(result).toBeGreaterThan(3);
 +   */
 +  function toBeGreaterThan() {
 +    return {
 +      compare: function(actual, expected) {
 +        return {
 +          pass: actual > expected
 +        };
 +      }
 +    };
 +  }
 +
 +  return toBeGreaterThan;
 +};
 +
 +getJasmineRequireObj().toBeGreaterThanOrEqual = function() {
 +  /**
 +   * {@link expect} the actual value to be greater than or equal to the expected value.
 +   * @function
 +   * @name matchers#toBeGreaterThanOrEqual
 +   * @since 2.0.0
 +   * @param {Number} expected - The expected value to compare against.
 +   * @example
 +   * expect(result).toBeGreaterThanOrEqual(25);
 +   */
 +  function toBeGreaterThanOrEqual() {
 +    return {
 +      compare: function(actual, expected) {
 +        return {
 +          pass: actual >= expected
 +        };
 +      }
 +    };
 +  }
 +
 +  return toBeGreaterThanOrEqual;
 +};
 +
 +getJasmineRequireObj().toBeInstanceOf = function(j$) {
 +  var usageError = j$.formatErrorMsg(
 +    '<toBeInstanceOf>',
 +    'expect(value).toBeInstanceOf(<ConstructorFunction>)'
 +  );
 +
 +  /**
 +   * {@link expect} the actual to be an instance of the expected class
 +   * @function
 +   * @name matchers#toBeInstanceOf
 +   * @since 3.5.0
 +   * @param {Object} expected - The class or constructor function to check for
 +   * @example
 +   * expect('foo').toBeInstanceOf(String);
 +   * expect(3).toBeInstanceOf(Number);
 +   * expect(new Error()).toBeInstanceOf(Error);
 +   */
 +  function toBeInstanceOf(matchersUtil) {
 +    return {
 +      compare: function(actual, expected) {
 +        var actualType =
 +            actual && actual.constructor
 +              ? j$.fnNameFor(actual.constructor)
 +              : matchersUtil.pp(actual),
 +          expectedType = expected
 +            ? j$.fnNameFor(expected)
 +            : matchersUtil.pp(expected),
 +          expectedMatcher,
 +          pass;
 +
 +        try {
 +          expectedMatcher = new j$.Any(expected);
 +          pass = expectedMatcher.asymmetricMatch(actual);
 +        } catch (error) {
 +          throw new Error(
 +            usageError('Expected value is not a constructor function')
 +          );
 +        }
 +
 +        if (pass) {
 +          return {
 +            pass: true,
 +            message:
 +              'Expected instance of ' +
 +              actualType +
 +              ' not to be an instance of ' +
 +              expectedType
 +          };
 +        } else {
 +          return {
 +            pass: false,
 +            message:
 +              'Expected instance of ' +
 +              actualType +
 +              ' to be an instance of ' +
 +              expectedType
 +          };
 +        }
 +      }
 +    };
 +  }
 +
 +  return toBeInstanceOf;
 +};
 +
 +getJasmineRequireObj().toBeLessThan = function() {
 +  /**
 +   * {@link expect} the actual value to be less than the expected value.
 +   * @function
 +   * @name matchers#toBeLessThan
 +   * @since 2.0.0
 +   * @param {Number} expected - The expected value to compare against.
 +   * @example
 +   * expect(result).toBeLessThan(0);
 +   */
 +  function toBeLessThan() {
 +    return {
 +      compare: function(actual, expected) {
 +        return {
 +          pass: actual < expected
 +        };
 +      }
 +    };
 +  }
 +
 +  return toBeLessThan;
 +};
 +
 +getJasmineRequireObj().toBeLessThanOrEqual = function() {
 +  /**
 +   * {@link expect} the actual value to be less than or equal to the expected value.
 +   * @function
 +   * @name matchers#toBeLessThanOrEqual
 +   * @since 2.0.0
 +   * @param {Number} expected - The expected value to compare against.
 +   * @example
 +   * expect(result).toBeLessThanOrEqual(123);
 +   */
 +  function toBeLessThanOrEqual() {
 +    return {
 +      compare: function(actual, expected) {
 +        return {
 +          pass: actual <= expected
 +        };
 +      }
 +    };
 +  }
 +
 +  return toBeLessThanOrEqual;
 +};
 +
 +getJasmineRequireObj().toBeNaN = function(j$) {
 +  /**
 +   * {@link expect} the actual value to be `NaN` (Not a Number).
 +   * @function
 +   * @name matchers#toBeNaN
 +   * @since 1.3.0
 +   * @example
 +   * expect(thing).toBeNaN();
 +   */
 +  function toBeNaN(matchersUtil) {
 +    return {
 +      compare: function(actual) {
 +        var result = {
 +          pass: actual !== actual
 +        };
 +
 +        if (result.pass) {
 +          result.message = 'Expected actual not to be NaN.';
 +        } else {
 +          result.message = function() {
 +            return 'Expected ' + matchersUtil.pp(actual) + ' to be NaN.';
 +          };
 +        }
 +
 +        return result;
 +      }
 +    };
 +  }
 +
 +  return toBeNaN;
 +};
 +
 +getJasmineRequireObj().toBeNegativeInfinity = function(j$) {
 +  /**
 +   * {@link expect} the actual value to be `-Infinity` (-infinity).
 +   * @function
 +   * @name matchers#toBeNegativeInfinity
 +   * @since 2.6.0
 +   * @example
 +   * expect(thing).toBeNegativeInfinity();
 +   */
 +  function toBeNegativeInfinity(matchersUtil) {
 +    return {
 +      compare: function(actual) {
 +        var result = {
 +          pass: actual === Number.NEGATIVE_INFINITY
 +        };
 +
 +        if (result.pass) {
 +          result.message = 'Expected actual not to be -Infinity.';
 +        } else {
 +          result.message = function() {
 +            return 'Expected ' + matchersUtil.pp(actual) + ' to be -Infinity.';
 +          };
 +        }
 +
 +        return result;
 +      }
 +    };
 +  }
 +
 +  return toBeNegativeInfinity;
 +};
 +
 +getJasmineRequireObj().toBeNull = function() {
 +  /**
 +   * {@link expect} the actual value to be `null`.
 +   * @function
 +   * @name matchers#toBeNull
 +   * @since 1.3.0
 +   * @example
 +   * expect(result).toBeNull();
 +   */
 +  function toBeNull() {
 +    return {
 +      compare: function(actual) {
 +        return {
 +          pass: actual === null
 +        };
 +      }
 +    };
 +  }
 +
 +  return toBeNull;
 +};
 +
 +getJasmineRequireObj().toBePositiveInfinity = function(j$) {
 +  /**
 +   * {@link expect} the actual value to be `Infinity` (infinity).
 +   * @function
 +   * @name matchers#toBePositiveInfinity
 +   * @since 2.6.0
 +   * @example
 +   * expect(thing).toBePositiveInfinity();
 +   */
 +  function toBePositiveInfinity(matchersUtil) {
 +    return {
 +      compare: function(actual) {
 +        var result = {
 +          pass: actual === Number.POSITIVE_INFINITY
 +        };
 +
 +        if (result.pass) {
 +          result.message = 'Expected actual not to be Infinity.';
 +        } else {
 +          result.message = function() {
 +            return 'Expected ' + matchersUtil.pp(actual) + ' to be Infinity.';
 +          };
 +        }
 +
 +        return result;
 +      }
 +    };
 +  }
 +
 +  return toBePositiveInfinity;
 +};
 +
 +getJasmineRequireObj().toBeTrue = function() {
 +  /**
 +   * {@link expect} the actual value to be `true`.
 +   * @function
 +   * @name matchers#toBeTrue
 +   * @since 3.5.0
 +   * @example
 +   * expect(result).toBeTrue();
 +   */
 +  function toBeTrue() {
 +    return {
 +      compare: function(actual) {
 +        return {
 +          pass: actual === true
 +        };
 +      }
 +    };
 +  }
 +
 +  return toBeTrue;
 +};
 +
 +getJasmineRequireObj().toBeTruthy = function() {
 +  /**
 +   * {@link expect} the actual value to be truthy.
 +   * @function
 +   * @name matchers#toBeTruthy
 +   * @since 2.0.0
 +   * @example
 +   * expect(thing).toBeTruthy();
 +   */
 +  function toBeTruthy() {
 +    return {
 +      compare: function(actual) {
 +        return {
 +          pass: !!actual
 +        };
 +      }
 +    };
 +  }
 +
 +  return toBeTruthy;
 +};
 +
 +getJasmineRequireObj().toBeUndefined = function() {
 +  /**
 +   * {@link expect} the actual value to be `undefined`.
 +   * @function
 +   * @name matchers#toBeUndefined
 +   * @since 1.3.0
 +   * @example
 +   * expect(result).toBeUndefined():
 +   */
 +  function toBeUndefined() {
 +    return {
 +      compare: function(actual) {
 +        return {
 +          pass: void 0 === actual
 +        };
 +      }
 +    };
 +  }
 +
 +  return toBeUndefined;
 +};
 +
 +getJasmineRequireObj().toContain = function() {
 +  /**
 +   * {@link expect} the actual value to contain a specific value.
 +   * @function
 +   * @name matchers#toContain
 +   * @since 2.0.0
 +   * @param {Object} expected - The value to look for.
 +   * @example
 +   * expect(array).toContain(anElement);
 +   * expect(string).toContain(substring);
 +   */
 +  function toContain(matchersUtil) {
 +    return {
 +      compare: function(actual, expected) {
 +        return {
 +          pass: matchersUtil.contains(actual, expected)
 +        };
 +      }
 +    };
 +  }
 +
 +  return toContain;
 +};
 +
 +getJasmineRequireObj().toEqual = function(j$) {
 +  /**
 +   * {@link expect} the actual value to be equal to the expected, using deep equality comparison.
 +   * @function
 +   * @name matchers#toEqual
 +   * @since 1.3.0
 +   * @param {Object} expected - Expected value
 +   * @example
 +   * expect(bigObject).toEqual({"foo": ['bar', 'baz']});
 +   */
 +  function toEqual(matchersUtil) {
 +    return {
 +      compare: function(actual, expected) {
 +        var result = {
 +            pass: false
 +          },
 +          diffBuilder = j$.DiffBuilder({ prettyPrinter: matchersUtil.pp });
 +
 +        result.pass = matchersUtil.equals(actual, expected, diffBuilder);
 +
 +        // TODO: only set error message if test fails
 +        result.message = diffBuilder.getMessage();
 +
 +        return result;
 +      }
 +    };
 +  }
 +
 +  return toEqual;
 +};
 +
 +getJasmineRequireObj().toHaveBeenCalled = function(j$) {
 +  var getErrorMsg = j$.formatErrorMsg(
 +    '<toHaveBeenCalled>',
 +    'expect(<spyObj>).toHaveBeenCalled()'
 +  );
 +
 +  /**
 +   * {@link expect} the actual (a {@link Spy}) to have been called.
 +   * @function
 +   * @name matchers#toHaveBeenCalled
 +   * @since 1.3.0
 +   * @example
 +   * expect(mySpy).toHaveBeenCalled();
 +   * expect(mySpy).not.toHaveBeenCalled();
 +   */
 +  function toHaveBeenCalled(matchersUtil) {
 +    return {
 +      compare: function(actual) {
 +        var result = {};
 +
 +        if (!j$.isSpy(actual)) {
 +          throw new Error(
 +            getErrorMsg(
 +              'Expected a spy, but got ' + matchersUtil.pp(actual) + '.'
 +            )
 +          );
 +        }
 +
 +        if (arguments.length > 1) {
 +          throw new Error(
 +            getErrorMsg('Does not take arguments, use toHaveBeenCalledWith')
 +          );
 +        }
 +
 +        result.pass = actual.calls.any();
 +
 +        result.message = result.pass
 +          ? 'Expected spy ' + actual.and.identity + ' not to have been called.'
 +          : 'Expected spy ' + actual.and.identity + ' to have been called.';
 +
 +        return result;
 +      }
 +    };
 +  }
 +
 +  return toHaveBeenCalled;
 +};
 +
 +getJasmineRequireObj().toHaveBeenCalledBefore = function(j$) {
 +  var getErrorMsg = j$.formatErrorMsg(
 +    '<toHaveBeenCalledBefore>',
 +    'expect(<spyObj>).toHaveBeenCalledBefore(<spyObj>)'
 +  );
 +
 +  /**
 +   * {@link expect} the actual value (a {@link Spy}) to have been called before another {@link Spy}.
 +   * @function
 +   * @name matchers#toHaveBeenCalledBefore
 +   * @since 2.6.0
 +   * @param {Spy} expected - {@link Spy} that should have been called after the `actual` {@link Spy}.
 +   * @example
 +   * expect(mySpy).toHaveBeenCalledBefore(otherSpy);
 +   */
 +  function toHaveBeenCalledBefore(matchersUtil) {
 +    return {
 +      compare: function(firstSpy, latterSpy) {
 +        if (!j$.isSpy(firstSpy)) {
 +          throw new Error(
 +            getErrorMsg(
 +              'Expected a spy, but got ' + matchersUtil.pp(firstSpy) + '.'
 +            )
 +          );
 +        }
 +        if (!j$.isSpy(latterSpy)) {
 +          throw new Error(
 +            getErrorMsg(
 +              'Expected a spy, but got ' + matchersUtil.pp(latterSpy) + '.'
 +            )
 +          );
 +        }
 +
 +        var result = { pass: false };
 +
 +        if (!firstSpy.calls.count()) {
 +          result.message =
 +            'Expected spy ' + firstSpy.and.identity + ' to have been called.';
 +          return result;
 +        }
 +        if (!latterSpy.calls.count()) {
 +          result.message =
 +            'Expected spy ' + latterSpy.and.identity + ' to have been called.';
 +          return result;
 +        }
 +
 +        var latest1stSpyCall = firstSpy.calls.mostRecent().invocationOrder;
 +        var first2ndSpyCall = latterSpy.calls.first().invocationOrder;
 +
 +        result.pass = latest1stSpyCall < first2ndSpyCall;
 +
 +        if (result.pass) {
 +          result.message =
 +            'Expected spy ' +
 +            firstSpy.and.identity +
 +            ' to not have been called before spy ' +
 +            latterSpy.and.identity +
 +            ', but it was';
 +        } else {
 +          var first1stSpyCall = firstSpy.calls.first().invocationOrder;
 +          var latest2ndSpyCall = latterSpy.calls.mostRecent().invocationOrder;
 +
 +          if (first1stSpyCall < first2ndSpyCall) {
 +            result.message =
 +              'Expected latest call to spy ' +
 +              firstSpy.and.identity +
 +              ' to have been called before first call to spy ' +
 +              latterSpy.and.identity +
 +              ' (no interleaved calls)';
 +          } else if (latest2ndSpyCall > latest1stSpyCall) {
 +            result.message =
 +              'Expected first call to spy ' +
 +              latterSpy.and.identity +
 +              ' to have been called after latest call to spy ' +
 +              firstSpy.and.identity +
 +              ' (no interleaved calls)';
 +          } else {
 +            result.message =
 +              'Expected spy ' +
 +              firstSpy.and.identity +
 +              ' to have been called before spy ' +
 +              latterSpy.and.identity;
 +          }
 +        }
 +
 +        return result;
 +      }
 +    };
 +  }
 +
 +  return toHaveBeenCalledBefore;
 +};
 +
 +getJasmineRequireObj().toHaveBeenCalledOnceWith = function(j$) {
 +  var getErrorMsg = j$.formatErrorMsg(
 +    '<toHaveBeenCalledOnceWith>',
 +    'expect(<spyObj>).toHaveBeenCalledOnceWith(...arguments)'
 +  );
 +
 +  /**
 +   * {@link expect} the actual (a {@link Spy}) to have been called exactly once, and exactly with the particular arguments.
 +   * @function
 +   * @name matchers#toHaveBeenCalledOnceWith
 +   * @since 3.6.0
 +   * @param {...Object} - The arguments to look for
 +   * @example
 +   * expect(mySpy).toHaveBeenCalledOnceWith('foo', 'bar', 2);
 +   */
 +  function toHaveBeenCalledOnceWith(util) {
 +    return {
 +      compare: function() {
 +        var args = Array.prototype.slice.call(arguments, 0),
 +          actual = args[0],
 +          expectedArgs = args.slice(1);
 +
 +        if (!j$.isSpy(actual)) {
 +          throw new Error(
 +            getErrorMsg('Expected a spy, but got ' + util.pp(actual) + '.')
 +          );
 +        }
 +
 +        var prettyPrintedCalls = actual.calls
 +          .allArgs()
 +          .map(function(argsForCall) {
 +            return '  ' + util.pp(argsForCall);
 +          });
 +
 +        if (
 +          actual.calls.count() === 1 &&
 +          util.contains(actual.calls.allArgs(), expectedArgs)
 +        ) {
 +          return {
 +            pass: true,
 +            message:
 +              'Expected spy ' +
 +              actual.and.identity +
 +              ' to have been called 0 times, multiple times, or once, but with arguments different from:\n' +
 +              '  ' +
 +              util.pp(expectedArgs) +
 +              '\n' +
 +              'But the actual call was:\n' +
 +              prettyPrintedCalls.join(',\n') +
 +              '.\n\n'
 +          };
 +        }
 +
 +        function getDiffs() {
 +          return actual.calls.allArgs().map(function(argsForCall, callIx) {
 +            var diffBuilder = new j$.DiffBuilder();
 +            util.equals(argsForCall, expectedArgs, diffBuilder);
 +            return diffBuilder.getMessage();
 +          });
 +        }
 +
 +        function butString() {
 +          switch (actual.calls.count()) {
 +            case 0:
 +              return 'But it was never called.\n\n';
 +            case 1:
 +              return (
 +                'But the actual call was:\n' +
 +                prettyPrintedCalls.join(',\n') +
 +                '.\n' +
 +                getDiffs().join('\n') +
 +                '\n\n'
 +              );
 +            default:
 +              return (
 +                'But the actual calls were:\n' +
 +                prettyPrintedCalls.join(',\n') +
 +                '.\n\n'
 +              );
 +          }
 +        }
 +
 +        return {
 +          pass: false,
 +          message:
 +            'Expected spy ' +
 +            actual.and.identity +
 +            ' to have been called only once, and with given args:\n' +
 +            '  ' +
 +            util.pp(expectedArgs) +
 +            '\n' +
 +            butString()
 +        };
 +      }
 +    };
 +  }
 +
 +  return toHaveBeenCalledOnceWith;
 +};
 +
 +getJasmineRequireObj().toHaveBeenCalledTimes = function(j$) {
 +  var getErrorMsg = j$.formatErrorMsg(
 +    '<toHaveBeenCalledTimes>',
 +    'expect(<spyObj>).toHaveBeenCalledTimes(<Number>)'
 +  );
 +
 +  /**
 +   * {@link expect} the actual (a {@link Spy}) to have been called the specified number of times.
 +   * @function
 +   * @name matchers#toHaveBeenCalledTimes
 +   * @since 2.4.0
 +   * @param {Number} expected - The number of invocations to look for.
 +   * @example
 +   * expect(mySpy).toHaveBeenCalledTimes(3);
 +   */
 +  function toHaveBeenCalledTimes(matchersUtil) {
 +    return {
 +      compare: function(actual, expected) {
 +        if (!j$.isSpy(actual)) {
 +          throw new Error(
 +            getErrorMsg(
 +              'Expected a spy, but got ' + matchersUtil.pp(actual) + '.'
 +            )
 +          );
 +        }
 +
 +        var args = Array.prototype.slice.call(arguments, 0),
 +          result = { pass: false };
 +
 +        if (!j$.isNumber_(expected)) {
 +          throw new Error(
 +            getErrorMsg(
 +              'The expected times failed is a required argument and must be a number.'
 +            )
 +          );
 +        }
 +
 +        actual = args[0];
 +        var calls = actual.calls.count();
 +        var timesMessage = expected === 1 ? 'once' : expected + ' times';
 +        result.pass = calls === expected;
 +        result.message = result.pass
 +          ? 'Expected spy ' +
 +            actual.and.identity +
 +            ' not to have been called ' +
 +            timesMessage +
 +            '. It was called ' +
 +            calls +
 +            ' times.'
 +          : 'Expected spy ' +
 +            actual.and.identity +
 +            ' to have been called ' +
 +            timesMessage +
 +            '. It was called ' +
 +            calls +
 +            ' times.';
 +        return result;
 +      }
 +    };
 +  }
 +
 +  return toHaveBeenCalledTimes;
 +};
 +
 +getJasmineRequireObj().toHaveBeenCalledWith = function(j$) {
 +  var getErrorMsg = j$.formatErrorMsg(
 +    '<toHaveBeenCalledWith>',
 +    'expect(<spyObj>).toHaveBeenCalledWith(...arguments)'
 +  );
 +
 +  /**
 +   * {@link expect} the actual (a {@link Spy}) to have been called with particular arguments at least once.
 +   * @function
 +   * @name matchers#toHaveBeenCalledWith
 +   * @since 1.3.0
 +   * @param {...Object} - The arguments to look for
 +   * @example
 +   * expect(mySpy).toHaveBeenCalledWith('foo', 'bar', 2);
 +   */
 +  function toHaveBeenCalledWith(matchersUtil) {
 +    return {
 +      compare: function() {
 +        var args = Array.prototype.slice.call(arguments, 0),
 +          actual = args[0],
 +          expectedArgs = args.slice(1),
 +          result = { pass: false };
 +
 +        if (!j$.isSpy(actual)) {
 +          throw new Error(
 +            getErrorMsg(
 +              'Expected a spy, but got ' + matchersUtil.pp(actual) + '.'
 +            )
 +          );
 +        }
 +
 +        if (!actual.calls.any()) {
 +          result.message = function() {
 +            return (
 +              'Expected spy ' +
 +              actual.and.identity +
 +              ' to have been called with:\n' +
 +              '  ' +
 +              matchersUtil.pp(expectedArgs) +
 +              '\nbut it was never called.'
 +            );
 +          };
 +          return result;
 +        }
 +
 +        if (matchersUtil.contains(actual.calls.allArgs(), expectedArgs)) {
 +          result.pass = true;
 +          result.message = function() {
 +            return (
 +              'Expected spy ' +
 +              actual.and.identity +
 +              ' not to have been called with:\n' +
 +              '  ' +
 +              matchersUtil.pp(expectedArgs) +
 +              '\nbut it was.'
 +            );
 +          };
 +        } else {
 +          result.message = function() {
 +            var prettyPrintedCalls = actual.calls
 +              .allArgs()
 +              .map(function(argsForCall) {
 +                return '  ' + matchersUtil.pp(argsForCall);
 +              });
 +
 +            var diffs = actual.calls
 +              .allArgs()
 +              .map(function(argsForCall, callIx) {
 +                var diffBuilder = new j$.DiffBuilder();
 +                matchersUtil.equals(argsForCall, expectedArgs, diffBuilder);
 +                return (
 +                  'Call ' +
 +                  callIx +
 +                  ':\n' +
 +                  diffBuilder.getMessage().replace(/^/gm, '  ')
 +                );
 +              });
 +
 +            return (
 +              'Expected spy ' +
 +              actual.and.identity +
 +              ' to have been called with:\n' +
 +              '  ' +
 +              matchersUtil.pp(expectedArgs) +
 +              '\n' +
 +              '' +
 +              'but actual calls were:\n' +
 +              prettyPrintedCalls.join(',\n') +
 +              '.\n\n' +
 +              diffs.join('\n')
 +            );
 +          };
 +        }
 +
 +        return result;
 +      }
 +    };
 +  }
 +
 +  return toHaveBeenCalledWith;
 +};
 +
 +getJasmineRequireObj().toHaveClass = function(j$) {
 +  /**
 +   * {@link expect} the actual value to be a DOM element that has the expected class
 +   * @function
 +   * @name matchers#toHaveClass
 +   * @since 3.0.0
 +   * @param {Object} expected - The class name to test for
 +   * @example
 +   * var el = document.createElement('div');
 +   * el.className = 'foo bar baz';
 +   * expect(el).toHaveClass('bar');
 +   */
 +  function toHaveClass(matchersUtil) {
 +    return {
 +      compare: function(actual, expected) {
 +        if (!isElement(actual)) {
 +          throw new Error(matchersUtil.pp(actual) + ' is not a DOM element');
 +        }
 +
 +        return {
 +          pass: actual.classList.contains(expected)
 +        };
 +      }
 +    };
 +  }
 +
 +  function isElement(maybeEl) {
 +    return (
 +      maybeEl && maybeEl.classList && j$.isFunction_(maybeEl.classList.contains)
 +    );
 +  }
 +
 +  return toHaveClass;
 +};
 +
 +getJasmineRequireObj().toHaveSize = function(j$) {
 +  /**
 +   * {@link expect} the actual size to be equal to the expected, using array-like length or object keys size.
 +   * @function
 +   * @name matchers#toHaveSize
 +   * @since 3.6.0
 +   * @param {Object} expected - Expected size
 +   * @example
 +   * array = [1,2];
 +   * expect(array).toHaveSize(2);
 +   */
 +  function toHaveSize() {
 +    return {
 +      compare: function(actual, expected) {
 +        var result = {
 +          pass: false
 +        };
 +
 +        if (
 +          j$.isA_('WeakSet', actual) ||
 +          j$.isWeakMap(actual) ||
 +          j$.isDataView(actual)
 +        ) {
 +          throw new Error('Cannot get size of ' + actual + '.');
 +        }
 +
 +        if (j$.isSet(actual) || j$.isMap(actual)) {
 +          result.pass = actual.size === expected;
 +        } else if (isLength(actual.length)) {
 +          result.pass = actual.length === expected;
 +        } else {
 +          result.pass = Object.keys(actual).length === expected;
 +        }
 +
 +        return result;
 +      }
 +    };
 +  }
 +
 +  var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; // eslint-disable-line compat/compat
 +  function isLength(value) {
 +    return (
 +      typeof value == 'number' &&
 +      value > -1 &&
 +      value % 1 === 0 &&
 +      value <= MAX_SAFE_INTEGER
 +    );
 +  }
 +
 +  return toHaveSize;
 +};
 +
 +getJasmineRequireObj().toMatch = function(j$) {
 +  var getErrorMsg = j$.formatErrorMsg(
 +    '<toMatch>',
 +    'expect(<expectation>).toMatch(<string> || <regexp>)'
 +  );
 +
 +  /**
 +   * {@link expect} the actual value to match a regular expression
 +   * @function
 +   * @name matchers#toMatch
 +   * @since 1.3.0
 +   * @param {RegExp|String} expected - Value to look for in the string.
 +   * @example
 +   * expect("my string").toMatch(/string$/);
 +   * expect("other string").toMatch("her");
 +   */
 +  function toMatch() {
 +    return {
 +      compare: function(actual, expected) {
 +        if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) {
 +          throw new Error(getErrorMsg('Expected is not a String or a RegExp'));
 +        }
 +
 +        var regexp = new RegExp(expected);
 +
 +        return {
 +          pass: regexp.test(actual)
 +        };
 +      }
 +    };
 +  }
 +
 +  return toMatch;
 +};
 +
 +getJasmineRequireObj().toThrow = function(j$) {
 +  var getErrorMsg = j$.formatErrorMsg(
 +    '<toThrow>',
 +    'expect(function() {<expectation>}).toThrow()'
 +  );
 +
 +  /**
 +   * {@link expect} a function to `throw` something.
 +   * @function
 +   * @name matchers#toThrow
 +   * @since 2.0.0
 +   * @param {Object} [expected] - Value that should be thrown. If not provided, simply the fact that something was thrown will be checked.
 +   * @example
 +   * expect(function() { return 'things'; }).toThrow('foo');
 +   * expect(function() { return 'stuff'; }).toThrow();
 +   */
 +  function toThrow(matchersUtil) {
 +    return {
 +      compare: function(actual, expected) {
 +        var result = { pass: false },
 +          threw = false,
 +          thrown;
 +
 +        if (typeof actual != 'function') {
 +          throw new Error(getErrorMsg('Actual is not a Function'));
 +        }
 +
 +        try {
 +          actual();
 +        } catch (e) {
 +          threw = true;
 +          thrown = e;
 +        }
 +
 +        if (!threw) {
 +          result.message = 'Expected function to throw an exception.';
 +          return result;
 +        }
 +
 +        if (arguments.length == 1) {
 +          result.pass = true;
 +          result.message = function() {
 +            return (
 +              'Expected function not to throw, but it threw ' +
 +              matchersUtil.pp(thrown) +
 +              '.'
 +            );
 +          };
 +
 +          return result;
 +        }
 +
 +        if (matchersUtil.equals(thrown, expected)) {
 +          result.pass = true;
 +          result.message = function() {
 +            return (
 +              'Expected function not to throw ' +
 +              matchersUtil.pp(expected) +
 +              '.'
 +            );
 +          };
 +        } else {
 +          result.message = function() {
 +            return (
 +              'Expected function to throw ' +
 +              matchersUtil.pp(expected) +
 +              ', but it threw ' +
 +              matchersUtil.pp(thrown) +
 +              '.'
 +            );
 +          };
 +        }
 +
 +        return result;
 +      }
 +    };
 +  }
 +
 +  return toThrow;
 +};
 +
 +getJasmineRequireObj().toThrowError = function(j$) {
 +  var getErrorMsg = j$.formatErrorMsg(
 +    '<toThrowError>',
 +    'expect(function() {<expectation>}).toThrowError(<ErrorConstructor>, <message>)'
 +  );
 +
 +  /**
 +   * {@link expect} a function to `throw` an `Error`.
 +   * @function
 +   * @name matchers#toThrowError
 +   * @since 2.0.0
 +   * @param {Error} [expected] - `Error` constructor the object that was thrown needs to be an instance of. If not provided, `Error` will be used.
 +   * @param {RegExp|String} [message] - The message that should be set on the thrown `Error`
 +   * @example
 +   * expect(function() { return 'things'; }).toThrowError(MyCustomError, 'message');
 +   * expect(function() { return 'things'; }).toThrowError(MyCustomError, /bar/);
 +   * expect(function() { return 'stuff'; }).toThrowError(MyCustomError);
 +   * expect(function() { return 'other'; }).toThrowError(/foo/);
 +   * expect(function() { return 'other'; }).toThrowError();
 +   */
 +  function toThrowError(matchersUtil) {
 +    return {
 +      compare: function(actual) {
 +        var errorMatcher = getMatcher.apply(null, arguments),
 +          thrown;
 +
 +        if (typeof actual != 'function') {
 +          throw new Error(getErrorMsg('Actual is not a Function'));
 +        }
 +
 +        try {
 +          actual();
 +          return fail('Expected function to throw an Error.');
 +        } catch (e) {
 +          thrown = e;
 +        }
 +
 +        if (!j$.isError_(thrown)) {
 +          return fail(function() {
 +            return (
 +              'Expected function to throw an Error, but it threw ' +
 +              matchersUtil.pp(thrown) +
 +              '.'
 +            );
 +          });
 +        }
 +
 +        return errorMatcher.match(thrown);
 +      }
 +    };
 +
 +    function getMatcher() {
 +      var expected, errorType;
 +
 +      if (arguments[2]) {
 +        errorType = arguments[1];
 +        expected = arguments[2];
 +        if (!isAnErrorType(errorType)) {
 +          throw new Error(getErrorMsg('Expected error type is not an Error.'));
 +        }
 +
 +        return exactMatcher(expected, errorType);
 +      } else if (arguments[1]) {
 +        expected = arguments[1];
 +
 +        if (isAnErrorType(arguments[1])) {
 +          return exactMatcher(null, arguments[1]);
 +        } else {
 +          return exactMatcher(arguments[1], null);
 +        }
 +      } else {
 +        return anyMatcher();
 +      }
 +    }
 +
 +    function anyMatcher() {
 +      return {
 +        match: function(error) {
 +          return pass(
 +            'Expected function not to throw an Error, but it threw ' +
 +              j$.fnNameFor(error) +
 +              '.'
 +          );
 +        }
 +      };
 +    }
 +
 +    function exactMatcher(expected, errorType) {
 +      if (expected && !isStringOrRegExp(expected)) {
 +        if (errorType) {
 +          throw new Error(
 +            getErrorMsg('Expected error message is not a string or RegExp.')
 +          );
 +        } else {
 +          throw new Error(
 +            getErrorMsg('Expected is not an Error, string, or RegExp.')
 +          );
 +        }
 +      }
 +
 +      function messageMatch(message) {
 +        if (typeof expected == 'string') {
 +          return expected == message;
 +        } else {
 +          return expected.test(message);
 +        }
 +      }
 +
 +      var errorTypeDescription = errorType
 +        ? j$.fnNameFor(errorType)
 +        : 'an exception';
 +
 +      function thrownDescription(thrown) {
 +        var thrownName = errorType
 +            ? j$.fnNameFor(thrown.constructor)
 +            : 'an exception',
 +          thrownMessage = '';
 +
 +        if (expected) {
 +          thrownMessage = ' with message ' + matchersUtil.pp(thrown.message);
 +        }
 +
 +        return thrownName + thrownMessage;
 +      }
 +
 +      function messageDescription() {
 +        if (expected === null) {
 +          return '';
 +        } else if (expected instanceof RegExp) {
 +          return ' with a message matching ' + matchersUtil.pp(expected);
 +        } else {
 +          return ' with message ' + matchersUtil.pp(expected);
 +        }
 +      }
 +
 +      function matches(error) {
 +        return (
 +          (errorType === null || error instanceof errorType) &&
 +          (expected === null || messageMatch(error.message))
 +        );
 +      }
 +
 +      return {
 +        match: function(thrown) {
 +          if (matches(thrown)) {
 +            return pass(function() {
 +              return (
 +                'Expected function not to throw ' +
 +                errorTypeDescription +
 +                messageDescription() +
 +                '.'
 +              );
 +            });
 +          } else {
 +            return fail(function() {
 +              return (
 +                'Expected function to throw ' +
 +                errorTypeDescription +
 +                messageDescription() +
 +                ', but it threw ' +
 +                thrownDescription(thrown) +
 +                '.'
 +              );
 +            });
 +          }
 +        }
 +      };
 +    }
 +
 +    function isStringOrRegExp(potential) {
 +      return potential instanceof RegExp || typeof potential == 'string';
 +    }
 +
 +    function isAnErrorType(type) {
 +      if (typeof type !== 'function') {
 +        return false;
 +      }
 +
 +      var Surrogate = function() {};
 +      Surrogate.prototype = type.prototype;
 +      return j$.isError_(new Surrogate());
 +    }
 +  }
 +
 +  function pass(message) {
 +    return {
 +      pass: true,
 +      message: message
 +    };
 +  }
 +
 +  function fail(message) {
 +    return {
 +      pass: false,
 +      message: message
 +    };
 +  }
 +
 +  return toThrowError;
 +};
 +
 +getJasmineRequireObj().toThrowMatching = function(j$) {
 +  var usageError = j$.formatErrorMsg(
 +    '<toThrowMatching>',
 +    'expect(function() {<expectation>}).toThrowMatching(<Predicate>)'
 +  );
 +
 +  /**
 +   * {@link expect} a function to `throw` something matching a predicate.
 +   * @function
 +   * @name matchers#toThrowMatching
 +   * @since 3.0.0
 +   * @param {Function} predicate - A function that takes the thrown exception as its parameter and returns true if it matches.
 +   * @example
 +   * expect(function() { throw new Error('nope'); }).toThrowMatching(function(thrown) { return thrown.message === 'nope'; });
 +   */
 +  function toThrowMatching(matchersUtil) {
 +    return {
 +      compare: function(actual, predicate) {
 +        var thrown;
 +
 +        if (typeof actual !== 'function') {
 +          throw new Error(usageError('Actual is not a Function'));
 +        }
 +
 +        if (typeof predicate !== 'function') {
 +          throw new Error(usageError('Predicate is not a Function'));
 +        }
 +
 +        try {
 +          actual();
 +          return fail('Expected function to throw an exception.');
 +        } catch (e) {
 +          thrown = e;
 +        }
 +
 +        if (predicate(thrown)) {
 +          return pass(
 +            'Expected function not to throw an exception matching a predicate.'
 +          );
 +        } else {
 +          return fail(function() {
 +            return (
 +              'Expected function to throw an exception matching a predicate, ' +
 +              'but it threw ' +
 +              thrownDescription(thrown) +
 +              '.'
 +            );
 +          });
 +        }
 +      }
 +    };
 +
 +    function thrownDescription(thrown) {
 +      if (thrown && thrown.constructor) {
 +        return (
 +          j$.fnNameFor(thrown.constructor) +
 +          ' with message ' +
 +          matchersUtil.pp(thrown.message)
 +        );
 +      } else {
 +        return matchersUtil.pp(thrown);
 +      }
 +    }
 +  }
 +
 +  function pass(message) {
 +    return {
 +      pass: true,
 +      message: message
 +    };
 +  }
 +
 +  function fail(message) {
 +    return {
 +      pass: false,
 +      message: message
 +    };
 +  }
 +
 +  return toThrowMatching;
 +};
 +
- getJasmineRequireObj().MockDate = function() {
++getJasmineRequireObj().MockDate = function(j$) {
 +  function MockDate(global) {
 +    var self = this;
 +    var currentTime = 0;
 +
 +    if (!global || !global.Date) {
 +      self.install = function() {};
 +      self.tick = function() {};
 +      self.uninstall = function() {};
 +      return self;
 +    }
 +
 +    var GlobalDate = global.Date;
 +
 +    self.install = function(mockDate) {
 +      if (mockDate instanceof GlobalDate) {
 +        currentTime = mockDate.getTime();
 +      } else {
++        if (!j$.util.isUndefined(mockDate)) {
++          j$.getEnv().deprecated(
++            'The argument to jasmine.clock().mockDate(), if specified, ' +
++              'should be a Date instance. Passing anything other than a Date ' +
++              'will be treated as an error in a future release.'
++          );
++        }
++
 +        currentTime = new GlobalDate().getTime();
 +      }
 +
 +      global.Date = FakeDate;
 +    };
 +
 +    self.tick = function(millis) {
 +      millis = millis || 0;
 +      currentTime = currentTime + millis;
 +    };
 +
 +    self.uninstall = function() {
 +      currentTime = 0;
 +      global.Date = GlobalDate;
 +    };
 +
 +    createDateProperties();
 +
 +    return self;
 +
 +    function FakeDate() {
 +      switch (arguments.length) {
 +        case 0:
 +          return new GlobalDate(currentTime);
 +        case 1:
 +          return new GlobalDate(arguments[0]);
 +        case 2:
 +          return new GlobalDate(arguments[0], arguments[1]);
 +        case 3:
 +          return new GlobalDate(arguments[0], arguments[1], arguments[2]);
 +        case 4:
 +          return new GlobalDate(
 +            arguments[0],
 +            arguments[1],
 +            arguments[2],
 +            arguments[3]
 +          );
 +        case 5:
 +          return new GlobalDate(
 +            arguments[0],
 +            arguments[1],
 +            arguments[2],
 +            arguments[3],
 +            arguments[4]
 +          );
 +        case 6:
 +          return new GlobalDate(
 +            arguments[0],
 +            arguments[1],
 +            arguments[2],
 +            arguments[3],
 +            arguments[4],
 +            arguments[5]
 +          );
 +        default:
 +          return new GlobalDate(
 +            arguments[0],
 +            arguments[1],
 +            arguments[2],
 +            arguments[3],
 +            arguments[4],
 +            arguments[5],
 +            arguments[6]
 +          );
 +      }
 +    }
 +
 +    function createDateProperties() {
 +      FakeDate.prototype = GlobalDate.prototype;
 +
 +      FakeDate.now = function() {
 +        if (GlobalDate.now) {
 +          return currentTime;
 +        } else {
 +          throw new Error('Browser does not support Date.now()');
 +        }
 +      };
 +
 +      FakeDate.toSource = GlobalDate.toSource;
 +      FakeDate.toString = GlobalDate.toString;
 +      FakeDate.parse = GlobalDate.parse;
 +      FakeDate.UTC = GlobalDate.UTC;
 +    }
 +  }
 +
 +  return MockDate;
 +};
 +
 +getJasmineRequireObj().makePrettyPrinter = function(j$) {
 +  function SinglePrettyPrintRun(customObjectFormatters, pp) {
 +    this.customObjectFormatters_ = customObjectFormatters;
 +    this.ppNestLevel_ = 0;
 +    this.seen = [];
 +    this.length = 0;
 +    this.stringParts = [];
 +    this.pp_ = pp;
 +  }
 +
 +  function hasCustomToString(value) {
 +    // value.toString !== Object.prototype.toString if value has no custom toString but is from another context (e.g.
 +    // iframe, web worker)
 +    try {
 +      return (
 +        j$.isFunction_(value.toString) &&
 +        value.toString !== Object.prototype.toString &&
 +        value.toString() !== Object.prototype.toString.call(value)
 +      );
 +    } catch (e) {
 +      // The custom toString() threw.
 +      return true;
 +    }
 +  }
 +
 +  SinglePrettyPrintRun.prototype.format = function(value) {
 +    this.ppNestLevel_++;
 +    try {
 +      var customFormatResult = this.applyCustomFormatters_(value);
 +
 +      if (customFormatResult) {
 +        this.emitScalar(customFormatResult);
 +      } else if (j$.util.isUndefined(value)) {
 +        this.emitScalar('undefined');
 +      } else if (value === null) {
 +        this.emitScalar('null');
 +      } else if (value === 0 && 1 / value === -Infinity) {
 +        this.emitScalar('-0');
 +      } else if (value === j$.getGlobal()) {
 +        this.emitScalar('<global>');
 +      } else if (value.jasmineToString) {
 +        this.emitScalar(value.jasmineToString(this.pp_));
 +      } else if (typeof value === 'string') {
 +        this.emitString(value);
 +      } else if (j$.isSpy(value)) {
 +        this.emitScalar('spy on ' + value.and.identity);
 +      } else if (j$.isSpy(value.toString)) {
 +        this.emitScalar('spy on ' + value.toString.and.identity);
 +      } else if (value instanceof RegExp) {
 +        this.emitScalar(value.toString());
 +      } else if (typeof value === 'function') {
 +        this.emitScalar('Function');
 +      } else if (j$.isDomNode(value)) {
 +        if (value.tagName) {
 +          this.emitDomElement(value);
 +        } else {
 +          this.emitScalar('HTMLNode');
 +        }
 +      } else if (value instanceof Date) {
 +        this.emitScalar('Date(' + value + ')');
 +      } else if (j$.isSet(value)) {
 +        this.emitSet(value);
 +      } else if (j$.isMap(value)) {
 +        this.emitMap(value);
 +      } else if (j$.isTypedArray_(value)) {
 +        this.emitTypedArray(value);
 +      } else if (
 +        value.toString &&
 +        typeof value === 'object' &&
 +        !j$.isArray_(value) &&
 +        hasCustomToString(value)
 +      ) {
 +        try {
 +          this.emitScalar(value.toString());
 +        } catch (e) {
 +          this.emitScalar('has-invalid-toString-method');
 +        }
 +      } else if (j$.util.arrayContains(this.seen, value)) {
 +        this.emitScalar(
 +          '<circular reference: ' +
 +            (j$.isArray_(value) ? 'Array' : 'Object') +
 +            '>'
 +        );
 +      } else if (j$.isArray_(value) || j$.isA_('Object', value)) {
 +        this.seen.push(value);
 +        if (j$.isArray_(value)) {
 +          this.emitArray(value);
 +        } else {
 +          this.emitObject(value);
 +        }
 +        this.seen.pop();
 +      } else {
 +        this.emitScalar(value.toString());
 +      }
 +    } catch (e) {
 +      if (this.ppNestLevel_ > 1 || !(e instanceof MaxCharsReachedError)) {
 +        throw e;
 +      }
 +    } finally {
 +      this.ppNestLevel_--;
 +    }
 +  };
 +
 +  SinglePrettyPrintRun.prototype.applyCustomFormatters_ = function(value) {
 +    return customFormat(value, this.customObjectFormatters_);
 +  };
 +
 +  SinglePrettyPrintRun.prototype.iterateObject = function(obj, fn) {
 +    var objKeys = keys(obj, j$.isArray_(obj));
 +    var isGetter = function isGetter(prop) {};
 +
 +    if (obj.__lookupGetter__) {
 +      isGetter = function isGetter(prop) {
 +        var getter = obj.__lookupGetter__(prop);
 +        return !j$.util.isUndefined(getter) && getter !== null;
 +      };
 +    }
 +    var length = Math.min(objKeys.length, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH);
 +    for (var i = 0; i < length; i++) {
 +      var property = objKeys[i];
 +      fn(property, isGetter(property));
 +    }
 +
 +    return objKeys.length > length;
 +  };
 +
 +  SinglePrettyPrintRun.prototype.emitScalar = function(value) {
 +    this.append(value);
 +  };
 +
 +  SinglePrettyPrintRun.prototype.emitString = function(value) {
 +    this.append("'" + value + "'");
 +  };
 +
 +  SinglePrettyPrintRun.prototype.emitArray = function(array) {
 +    if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) {
 +      this.append('Array');
 +      return;
 +    }
 +    var length = Math.min(array.length, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH);
 +    this.append('[ ');
 +    for (var i = 0; i < length; i++) {
 +      if (i > 0) {
 +        this.append(', ');
 +      }
 +      this.format(array[i]);
 +    }
 +    if (array.length > length) {
 +      this.append(', ...');
 +    }
 +
 +    var self = this;
 +    var first = array.length === 0;
 +    var truncated = this.iterateObject(array, function(property, isGetter) {
 +      if (first) {
 +        first = false;
 +      } else {
 +        self.append(', ');
 +      }
 +
 +      self.formatProperty(array, property, isGetter);
 +    });
 +
 +    if (truncated) {
 +      this.append(', ...');
 +    }
 +
 +    this.append(' ]');
 +  };
 +
 +  SinglePrettyPrintRun.prototype.emitSet = function(set) {
 +    if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) {
 +      this.append('Set');
 +      return;
 +    }
 +    this.append('Set( ');
 +    var size = Math.min(set.size, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH);
 +    var i = 0;
 +    set.forEach(function(value, key) {
 +      if (i >= size) {
 +        return;
 +      }
 +      if (i > 0) {
 +        this.append(', ');
 +      }
 +      this.format(value);
 +
 +      i++;
 +    }, this);
 +    if (set.size > size) {
 +      this.append(', ...');
 +    }
 +    this.append(' )');
 +  };
 +
 +  SinglePrettyPrintRun.prototype.emitMap = function(map) {
 +    if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) {
 +      this.append('Map');
 +      return;
 +    }
 +    this.append('Map( ');
 +    var size = Math.min(map.size, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH);
 +    var i = 0;
 +    map.forEach(function(value, key) {
 +      if (i >= size) {
 +        return;
 +      }
 +      if (i > 0) {
 +        this.append(', ');
 +      }
 +      this.format([key, value]);
 +
 +      i++;
 +    }, this);
 +    if (map.size > size) {
 +      this.append(', ...');
 +    }
 +    this.append(' )');
 +  };
 +
 +  SinglePrettyPrintRun.prototype.emitObject = function(obj) {
 +    var ctor = obj.constructor,
 +      constructorName;
 +
 +    constructorName =
 +      typeof ctor === 'function' && obj instanceof ctor
 +        ? j$.fnNameFor(obj.constructor)
 +        : 'null';
 +
 +    this.append(constructorName);
 +
 +    if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) {
 +      return;
 +    }
 +
 +    var self = this;
 +    this.append('({ ');
 +    var first = true;
 +
 +    var truncated = this.iterateObject(obj, function(property, isGetter) {
 +      if (first) {
 +        first = false;
 +      } else {
 +        self.append(', ');
 +      }
 +
 +      self.formatProperty(obj, property, isGetter);
 +    });
 +
 +    if (truncated) {
 +      this.append(', ...');
 +    }
 +
 +    this.append(' })');
 +  };
 +
 +  SinglePrettyPrintRun.prototype.emitTypedArray = function(arr) {
 +    var constructorName = j$.fnNameFor(arr.constructor),
 +      limitedArray = Array.prototype.slice.call(
 +        arr,
 +        0,
 +        j$.MAX_PRETTY_PRINT_ARRAY_LENGTH
 +      ),
 +      itemsString = Array.prototype.join.call(limitedArray, ', ');
 +
 +    if (limitedArray.length !== arr.length) {
 +      itemsString += ', ...';
 +    }
 +
 +    this.append(constructorName + ' [ ' + itemsString + ' ]');
 +  };
 +
 +  SinglePrettyPrintRun.prototype.emitDomElement = function(el) {
 +    var tagName = el.tagName.toLowerCase(),
 +      attrs = el.attributes,
 +      i,
 +      len = attrs.length,
 +      out = '<' + tagName,
 +      attr;
 +
 +    for (i = 0; i < len; i++) {
 +      attr = attrs[i];
 +      out += ' ' + attr.name;
 +
 +      if (attr.value !== '') {
 +        out += '="' + attr.value + '"';
 +      }
 +    }
 +
 +    out += '>';
 +
 +    if (el.childElementCount !== 0 || el.textContent !== '') {
 +      out += '...</' + tagName + '>';
 +    }
 +
 +    this.append(out);
 +  };
 +
 +  SinglePrettyPrintRun.prototype.formatProperty = function(
 +    obj,
 +    property,
 +    isGetter
 +  ) {
 +    this.append(property);
 +    this.append(': ');
 +    if (isGetter) {
 +      this.append('<getter>');
 +    } else {
 +      this.format(obj[property]);
 +    }
 +  };
 +
 +  SinglePrettyPrintRun.prototype.append = function(value) {
 +    // This check protects us from the rare case where an object has overriden
 +    // `toString()` with an invalid implementation (returning a non-string).
 +    if (typeof value !== 'string') {
 +      value = Object.prototype.toString.call(value);
 +    }
 +
 +    var result = truncate(value, j$.MAX_PRETTY_PRINT_CHARS - this.length);
 +    this.length += result.value.length;
 +    this.stringParts.push(result.value);
 +
 +    if (result.truncated) {
 +      throw new MaxCharsReachedError();
 +    }
 +  };
 +
 +  function truncate(s, maxlen) {
 +    if (s.length <= maxlen) {
 +      return { value: s, truncated: false };
 +    }
 +
 +    s = s.substring(0, maxlen - 4) + ' ...';
 +    return { value: s, truncated: true };
 +  }
 +
 +  function MaxCharsReachedError() {
 +    this.message =
 +      'Exceeded ' +
 +      j$.MAX_PRETTY_PRINT_CHARS +
 +      ' characters while pretty-printing a value';
 +  }
 +
 +  MaxCharsReachedError.prototype = new Error();
 +
 +  function keys(obj, isArray) {
 +    var allKeys = Object.keys
 +      ? Object.keys(obj)
 +      : (function(o) {
 +          var keys = [];
 +          for (var key in o) {
 +            if (j$.util.has(o, key)) {
 +              keys.push(key);
 +            }
 +          }
 +          return keys;
 +        })(obj);
 +
 +    if (!isArray) {
 +      return allKeys;
 +    }
 +
 +    if (allKeys.length === 0) {
 +      return allKeys;
 +    }
 +
 +    var extraKeys = [];
 +    for (var i = 0; i < allKeys.length; i++) {
 +      if (!/^[0-9]+$/.test(allKeys[i])) {
 +        extraKeys.push(allKeys[i]);
 +      }
 +    }
 +
 +    return extraKeys;
 +  }
 +
 +  function customFormat(value, customObjectFormatters) {
 +    var i, result;
 +
 +    for (i = 0; i < customObjectFormatters.length; i++) {
 +      result = customObjectFormatters[i](value);
 +
 +      if (result !== undefined) {
 +        return result;
 +      }
 +    }
 +  }
 +
 +  return function(customObjectFormatters) {
 +    customObjectFormatters = customObjectFormatters || [];
 +
 +    var pp = function(value) {
 +      var prettyPrinter = new SinglePrettyPrintRun(customObjectFormatters, pp);
 +      prettyPrinter.format(value);
 +      return prettyPrinter.stringParts.join('');
 +    };
 +
 +    pp.customFormat_ = function(value) {
 +      return customFormat(value, customObjectFormatters);
 +    };
 +
 +    return pp;
 +  };
 +};
 +
 +getJasmineRequireObj().QueueRunner = function(j$) {
 +  var nextid = 1;
 +
 +  function StopExecutionError() {}
 +  StopExecutionError.prototype = new Error();
 +  j$.StopExecutionError = StopExecutionError;
 +
-   function once(fn) {
++  function once(fn, onTwice) {
 +    var called = false;
 +    return function(arg) {
-       if (!called) {
++      if (called) {
++        if (onTwice) {
++          onTwice();
++        }
++      } else {
 +        called = true;
 +        // Direct call using single parameter, because cleanup/next does not need more
 +        fn(arg);
 +      }
 +      return null;
 +    };
 +  }
 +
++  function fallbackOnMultipleDone() {
++    console.error(
++      new Error(
++        "An asynchronous function called its 'done' " +
++          'callback more than once, in a QueueRunner without a onMultipleDone ' +
++          'handler.'
++      )
++    );
++  }
++
 +  function emptyFn() {}
 +
 +  function QueueRunner(attrs) {
 +    this.id_ = nextid++;
 +    var queueableFns = attrs.queueableFns || [];
 +    this.queueableFns = queueableFns.concat(attrs.cleanupFns || []);
 +    this.firstCleanupIx = queueableFns.length;
 +    this.onComplete = attrs.onComplete || emptyFn;
 +    this.clearStack =
 +      attrs.clearStack ||
 +      function(fn) {
 +        fn();
 +      };
 +    this.onException = attrs.onException || emptyFn;
++    this.onMultipleDone = attrs.onMultipleDone || fallbackOnMultipleDone;
 +    this.userContext = attrs.userContext || new j$.UserContext();
 +    this.timeout = attrs.timeout || {
 +      setTimeout: setTimeout,
 +      clearTimeout: clearTimeout
 +    };
 +    this.fail = attrs.fail || emptyFn;
 +    this.globalErrors = attrs.globalErrors || {
 +      pushListener: emptyFn,
 +      popListener: emptyFn
 +    };
 +    this.completeOnFirstError = !!attrs.completeOnFirstError;
 +    this.errored = false;
 +
 +    if (typeof this.onComplete !== 'function') {
 +      throw new Error('invalid onComplete ' + JSON.stringify(this.onComplete));
 +    }
 +    this.deprecated = attrs.deprecated;
 +  }
 +
 +  QueueRunner.prototype.execute = function() {
 +    var self = this;
 +    this.handleFinalError = function(message, source, lineno, colno, error) {
 +      // Older browsers would send the error as the first parameter. HTML5
 +      // specifies the the five parameters above. The error instance should
 +      // be preffered, otherwise the call stack would get lost.
 +      self.onException(error || message);
 +    };
 +    this.globalErrors.pushListener(this.handleFinalError);
 +    this.run(0);
 +  };
 +
 +  QueueRunner.prototype.skipToCleanup = function(lastRanIndex) {
 +    if (lastRanIndex < this.firstCleanupIx) {
 +      this.run(this.firstCleanupIx);
 +    } else {
 +      this.run(lastRanIndex + 1);
 +    }
 +  };
 +
 +  QueueRunner.prototype.clearTimeout = function(timeoutId) {
 +    Function.prototype.apply.apply(this.timeout.clearTimeout, [
 +      j$.getGlobal(),
 +      [timeoutId]
 +    ]);
 +  };
 +
 +  QueueRunner.prototype.setTimeout = function(fn, timeout) {
 +    return Function.prototype.apply.apply(this.timeout.setTimeout, [
 +      j$.getGlobal(),
 +      [fn, timeout]
 +    ]);
 +  };
 +
 +  QueueRunner.prototype.attempt = function attempt(iterativeIndex) {
 +    var self = this,
 +      completedSynchronously = true,
 +      handleError = function handleError(error) {
++        // TODO probably shouldn't next() right away here.
++        // That makes debugging async failures much more confusing.
 +        onException(error);
 +      },
 +      cleanup = once(function cleanup() {
 +        if (timeoutId !== void 0) {
 +          self.clearTimeout(timeoutId);
 +        }
 +        self.globalErrors.popListener(handleError);
 +      }),
-       next = once(function next(err) {
-         cleanup();
++      next = once(
++        function next(err) {
++          cleanup();
 +
-         if (j$.isError_(err)) {
-           if (!(err instanceof StopExecutionError) && !err.jasmineMessage) {
-             self.fail(err);
++          if (j$.isError_(err)) {
++            if (!(err instanceof StopExecutionError) && !err.jasmineMessage) {
++              self.fail(err);
++            }
++            self.errored = errored = true;
++          } else if (typeof err !== 'undefined' && !self.errored) {
++            self.deprecated(
++              'Any argument passed to a done callback will be treated as an ' +
++                'error in a future release. Call the done callback without ' +
++                "arguments if you don't want to trigger a spec failure."
++            );
 +          }
-           self.errored = errored = true;
-         }
 +
-         function runNext() {
-           if (self.completeOnFirstError && errored) {
-             self.skipToCleanup(iterativeIndex);
-           } else {
-             self.run(iterativeIndex + 1);
++          function runNext() {
++            if (self.completeOnFirstError && errored) {
++              self.skipToCleanup(iterativeIndex);
++            } else {
++              self.run(iterativeIndex + 1);
++            }
 +          }
-         }
 +
-         if (completedSynchronously) {
-           self.setTimeout(runNext);
-         } else {
-           runNext();
++          if (completedSynchronously) {
++            self.setTimeout(runNext);
++          } else {
++            runNext();
++          }
++        },
++        function() {
++          try {
++            if (!timedOut) {
++              self.onMultipleDone();
++            }
++          } catch (error) {
++            // Any error we catch here is probably due to a bug in Jasmine,
++            // and it's not likely to end up anywhere useful if we let it
++            // propagate. Log it so it can at least show up when debugging.
++            console.error(error);
++          }
 +        }
-       }),
++      ),
 +      errored = false,
++      timedOut = false,
 +      queueableFn = self.queueableFns[iterativeIndex],
 +      timeoutId,
 +      maybeThenable;
 +
 +    next.fail = function nextFail() {
 +      self.fail.apply(null, arguments);
 +      self.errored = errored = true;
 +      next();
 +    };
 +
 +    self.globalErrors.pushListener(handleError);
 +
 +    if (queueableFn.timeout !== undefined) {
 +      var timeoutInterval = queueableFn.timeout || j$.DEFAULT_TIMEOUT_INTERVAL;
 +      timeoutId = self.setTimeout(function() {
++        timedOut = true;
 +        var error = new Error(
 +          'Timeout - Async function did not complete within ' +
 +            timeoutInterval +
 +            'ms ' +
 +            (queueableFn.timeout
 +              ? '(custom timeout)'
 +              : '(set by jasmine.DEFAULT_TIMEOUT_INTERVAL)')
 +        );
++        // TODO Need to decide what to do about a successful completion after a
++        //   timeout. That should probably not be a deprecation, and maybe not
++        //   an error in 4.0. (But a diagnostic of some sort might be helpful.)
 +        onException(error);
 +        next();
 +      }, timeoutInterval);
 +    }
 +
 +    try {
 +      if (queueableFn.fn.length === 0) {
 +        maybeThenable = queueableFn.fn.call(self.userContext);
 +
 +        if (maybeThenable && j$.isFunction_(maybeThenable.then)) {
-           maybeThenable.then(next, onPromiseRejection);
++          maybeThenable.then(
++            wrapInPromiseResolutionHandler(next),
++            onPromiseRejection
++          );
 +          completedSynchronously = false;
 +          return { completedSynchronously: false };
 +        }
 +      } else {
 +        maybeThenable = queueableFn.fn.call(self.userContext, next);
 +        this.diagnoseConflictingAsync_(queueableFn.fn, maybeThenable);
 +        completedSynchronously = false;
 +        return { completedSynchronously: false };
 +      }
 +    } catch (e) {
 +      onException(e);
 +      self.errored = errored = true;
 +    }
 +
 +    cleanup();
 +    return { completedSynchronously: true, errored: errored };
 +
 +    function onException(e) {
 +      self.onException(e);
 +      self.errored = errored = true;
 +    }
 +
 +    function onPromiseRejection(e) {
 +      onException(e);
 +      next();
 +    }
 +  };
 +
 +  QueueRunner.prototype.run = function(recursiveIndex) {
 +    var length = this.queueableFns.length,
 +      self = this,
 +      iterativeIndex;
 +
 +    for (
 +      iterativeIndex = recursiveIndex;
 +      iterativeIndex < length;
 +      iterativeIndex++
 +    ) {
 +      var result = this.attempt(iterativeIndex);
 +
 +      if (!result.completedSynchronously) {
 +        return;
 +      }
 +
 +      self.errored = self.errored || result.errored;
 +
 +      if (this.completeOnFirstError && result.errored) {
 +        this.skipToCleanup(iterativeIndex);
 +        return;
 +      }
 +    }
 +
 +    this.clearStack(function() {
 +      self.globalErrors.popListener(self.handleFinalError);
-       self.onComplete(self.errored && new StopExecutionError());
++
++      if (self.errored) {
++        self.onComplete(new StopExecutionError());
++      } else {
++        self.onComplete();
++      }
 +    });
 +  };
 +
 +  QueueRunner.prototype.diagnoseConflictingAsync_ = function(fn, retval) {
++    var msg;
++
 +    if (retval && j$.isFunction_(retval.then)) {
-       // Issue a warning that matches the user's code
++      // Issue a warning that matches the user's code.
++      // Omit the stack trace because there's almost certainly no user code
++      // on the stack at this point.
 +      if (j$.isAsyncFunction_(fn)) {
-         this.deprecated(
++        msg =
 +          'An asynchronous before/it/after ' +
-             'function was defined with the async keyword but also took a ' +
-             'done callback. This is not supported and will stop working in' +
-             ' the future. Either remove the done callback (recommended) or ' +
-             'remove the async keyword.'
-         );
++          'function was defined with the async keyword but also took a ' +
++          'done callback. This is not supported and will stop working in' +
++          ' the future. Either remove the done callback (recommended) or ' +
++          'remove the async keyword.';
 +      } else {
-         this.deprecated(
++        msg =
 +          'An asynchronous before/it/after ' +
-             'function took a done callback but also returned a promise. ' +
-             'This is not supported and will stop working in the future. ' +
-             'Either remove the done callback (recommended) or change the ' +
-             'function to not return a promise.'
-         );
++          'function took a done callback but also returned a promise. ' +
++          'This is not supported and will stop working in the future. ' +
++          'Either remove the done callback (recommended) or change the ' +
++          'function to not return a promise.';
 +      }
++
++      this.deprecated(msg, { omitStackTrace: true });
 +    }
 +  };
 +
++  function wrapInPromiseResolutionHandler(fn) {
++    return function(maybeArg) {
++      if (j$.isError_(maybeArg)) {
++        fn(maybeArg);
++      } else {
++        fn();
++      }
++    };
++  }
++
 +  return QueueRunner;
 +};
 +
 +getJasmineRequireObj().ReportDispatcher = function(j$) {
-   function ReportDispatcher(methods, queueRunnerFactory) {
++  function ReportDispatcher(methods, queueRunnerFactory, deprecated) {
 +    var dispatchedMethods = methods || [];
 +
 +    for (var i = 0; i < dispatchedMethods.length; i++) {
 +      var method = dispatchedMethods[i];
 +      this[method] = (function(m) {
 +        return function() {
 +          dispatch(m, arguments);
 +        };
 +      })(method);
 +    }
 +
 +    var reporters = [];
 +    var fallbackReporter = null;
 +
 +    this.addReporter = function(reporter) {
 +      reporters.push(reporter);
 +    };
 +
 +    this.provideFallbackReporter = function(reporter) {
 +      fallbackReporter = reporter;
 +    };
 +
 +    this.clearReporters = function() {
 +      reporters = [];
 +    };
 +
 +    return this;
 +
 +    function dispatch(method, args) {
 +      if (reporters.length === 0 && fallbackReporter !== null) {
 +        reporters.push(fallbackReporter);
 +      }
 +      var onComplete = args[args.length - 1];
 +      args = j$.util.argsToArray(args).splice(0, args.length - 1);
 +      var fns = [];
 +      for (var i = 0; i < reporters.length; i++) {
 +        var reporter = reporters[i];
 +        addFn(fns, reporter, method, args);
 +      }
 +
 +      queueRunnerFactory({
 +        queueableFns: fns,
 +        onComplete: onComplete,
-         isReporter: true
++        isReporter: true,
++        onMultipleDone: function() {
++          deprecated(
++            "An asynchronous reporter callback called its 'done' callback " +
++              'more than once. This is a bug in the reporter callback in ' +
++              'question. This will be treated as an error in a future ' +
++              'version. See' +
++              '<https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#deprecations-due-to-calling-done-multiple-times> ' +
++              'for more information.',
++            { ignoreRunnable: true }
++          );
++        }
 +      });
 +    }
 +
 +    function addFn(fns, reporter, method, args) {
 +      var fn = reporter[method];
 +      if (!fn) {
 +        return;
 +      }
 +
 +      var thisArgs = j$.util.cloneArgs(args);
 +      if (fn.length <= 1) {
 +        fns.push({
 +          fn: function() {
 +            return fn.apply(reporter, thisArgs);
 +          }
 +        });
 +      } else {
 +        fns.push({
 +          fn: function(done) {
 +            return fn.apply(reporter, thisArgs.concat([done]));
 +          }
 +        });
 +      }
 +    }
 +  }
 +
 +  return ReportDispatcher;
 +};
 +
 +getJasmineRequireObj().interface = function(jasmine, env) {
 +  var jasmineInterface = {
 +    /**
 +     * Callback passed to parts of the Jasmine base interface.
 +     *
 +     * By default Jasmine assumes this function completes synchronously.
 +     * If you have code that you need to test asynchronously, you can declare that you receive a `done` callback, return a Promise, or use the `async` keyword if it is supported in your environment.
 +     * @callback implementationCallback
 +     * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
 +     * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
 +     */
 +
 +    /**
 +     * Create a group of specs (often called a suite).
 +     *
 +     * Calls to `describe` can be nested within other calls to compose your suite as a tree.
 +     * @name describe
 +     * @since 1.3.0
 +     * @function
 +     * @global
 +     * @param {String} description Textual description of the group
 +     * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs
 +     */
 +    describe: function(description, specDefinitions) {
 +      return env.describe(description, specDefinitions);
 +    },
 +
 +    /**
 +     * A temporarily disabled [`describe`]{@link describe}
 +     *
 +     * Specs within an `xdescribe` will be marked pending and not executed
 +     * @name xdescribe
 +     * @since 1.3.0
 +     * @function
 +     * @global
 +     * @param {String} description Textual description of the group
 +     * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs
 +     */
 +    xdescribe: function(description, specDefinitions) {
 +      return env.xdescribe(description, specDefinitions);
 +    },
 +
 +    /**
 +     * A focused [`describe`]{@link describe}
 +     *
 +     * If suites or specs are focused, only those that are focused will be executed
 +     * @see fit
 +     * @name fdescribe
 +     * @since 2.1.0
 +     * @function
 +     * @global
 +     * @param {String} description Textual description of the group
 +     * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs
 +     */
 +    fdescribe: function(description, specDefinitions) {
 +      return env.fdescribe(description, specDefinitions);
 +    },
 +
 +    /**
 +     * Define a single spec. A spec should contain one or more {@link expect|expectations} that test the state of the code.
 +     *
 +     * A spec whose expectations all succeed will be passing and a spec with any failures will fail.
 +     * The name `it` is a pronoun for the test target, not an abbreviation of anything. It makes the
 +     * spec more readable by connecting the function name `it` and the argument `description` as a
 +     * complete sentence.
 +     * @name it
 +     * @since 1.3.0
 +     * @function
 +     * @global
 +     * @param {String} description Textual description of what this spec is checking
 +     * @param {implementationCallback} [testFunction] Function that contains the code of your test. If not provided the test will be `pending`.
 +     * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec.
 +     * @see async
 +     */
 +    it: function() {
 +      return env.it.apply(env, arguments);
 +    },
 +
 +    /**
 +     * A temporarily disabled [`it`]{@link it}
 +     *
 +     * The spec will report as `pending` and will not be executed.
 +     * @name xit
 +     * @since 1.3.0
 +     * @function
 +     * @global
 +     * @param {String} description Textual description of what this spec is checking.
 +     * @param {implementationCallback} [testFunction] Function that contains the code of your test. Will not be executed.
 +     */
 +    xit: function() {
 +      return env.xit.apply(env, arguments);
 +    },
 +
 +    /**
 +     * A focused [`it`]{@link it}
 +     *
 +     * If suites or specs are focused, only those that are focused will be executed.
 +     * @name fit
 +     * @since 2.1.0
 +     * @function
 +     * @global
 +     * @param {String} description Textual description of what this spec is checking.
 +     * @param {implementationCallback} testFunction Function that contains the code of your test.
 +     * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec.
 +     * @see async
 +     */
 +    fit: function() {
 +      return env.fit.apply(env, arguments);
 +    },
 +
 +    /**
 +     * Run some shared setup before each of the specs in the {@link describe} in which it is called.
 +     * @name beforeEach
 +     * @since 1.3.0
 +     * @function
 +     * @global
 +     * @param {implementationCallback} [function] Function that contains the code to setup your specs.
 +     * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeEach.
 +     * @see async
 +     */
 +    beforeEach: function() {
 +      return env.beforeEach.apply(env, arguments);
 +    },
 +
 +    /**
 +     * Run some shared teardown after each of the specs in the {@link describe} in which it is called.
 +     * @name afterEach
 +     * @since 1.3.0
 +     * @function
 +     * @global
 +     * @param {implementationCallback} [function] Function that contains the code to teardown your specs.
 +     * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterEach.
 +     * @see async
 +     */
 +    afterEach: function() {
 +      return env.afterEach.apply(env, arguments);
 +    },
 +
 +    /**
 +     * Run some shared setup once before all of the specs in the {@link describe} are run.
 +     *
 +     * _Note:_ Be careful, sharing the setup from a beforeAll makes it easy to accidentally leak state between your specs so that they erroneously pass or fail.
 +     * @name beforeAll
 +     * @since 2.1.0
 +     * @function
 +     * @global
 +     * @param {implementationCallback} [function] Function that contains the code to setup your specs.
 +     * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeAll.
 +     * @see async
 +     */
 +    beforeAll: function() {
 +      return env.beforeAll.apply(env, arguments);
 +    },
 +
 +    /**
 +     * Run some shared teardown once after all of the specs in the {@link describe} are run.
 +     *
 +     * _Note:_ Be careful, sharing the teardown from a afterAll makes it easy to accidentally leak state between your specs so that they erroneously pass or fail.
 +     * @name afterAll
 +     * @since 2.1.0
 +     * @function
 +     * @global
 +     * @param {implementationCallback} [function] Function that contains the code to teardown your specs.
 +     * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterAll.
 +     * @see async
 +     */
 +    afterAll: function() {
 +      return env.afterAll.apply(env, arguments);
 +    },
 +
 +    /**
 +     * Sets a user-defined property that will be provided to reporters as part of the properties field of {@link SpecResult}
 +     * @name setSpecProperty
 +     * @since 3.6.0
 +     * @function
 +     * @param {String} key The name of the property
 +     * @param {*} value The value of the property
 +     */
 +    setSpecProperty: function(key, value) {
 +      return env.setSpecProperty(key, value);
 +    },
 +
 +    /**
 +     * Sets a user-defined property that will be provided to reporters as part of the properties field of {@link SuiteResult}
 +     * @name setSuiteProperty
 +     * @since 3.6.0
 +     * @function
 +     * @param {String} key The name of the property
 +     * @param {*} value The value of the property
 +     */
 +    setSuiteProperty: function(key, value) {
 +      return env.setSuiteProperty(key, value);
 +    },
 +
 +    /**
 +     * Create an expectation for a spec.
 +     * @name expect
 +     * @since 1.3.0
 +     * @function
 +     * @global
 +     * @param {Object} actual - Actual computed value to test expectations against.
 +     * @return {matchers}
 +     */
 +    expect: function(actual) {
 +      return env.expect(actual);
 +    },
 +
 +    /**
 +     * Create an asynchronous expectation for a spec. Note that the matchers
 +     * that are provided by an asynchronous expectation all return promises
 +     * which must be either returned from the spec or waited for using `await`
 +     * in order for Jasmine to associate them with the correct spec.
 +     * @name expectAsync
 +     * @since 3.3.0
 +     * @function
 +     * @global
 +     * @param {Object} actual - Actual computed value to test expectations against.
 +     * @return {async-matchers}
 +     * @example
 +     * await expectAsync(somePromise).toBeResolved();
 +     * @example
 +     * return expectAsync(somePromise).toBeResolved();
 +     */
 +    expectAsync: function(actual) {
 +      return env.expectAsync(actual);
 +    },
 +
 +    /**
 +     * Mark a spec as pending, expectation results will be ignored.
 +     * @name pending
 +     * @since 2.0.0
 +     * @function
 +     * @global
 +     * @param {String} [message] - Reason the spec is pending.
 +     */
 +    pending: function() {
 +      return env.pending.apply(env, arguments);
 +    },
 +
 +    /**
 +     * Explicitly mark a spec as failed.
 +     * @name fail
 +     * @since 2.1.0
 +     * @function
 +     * @global
 +     * @param {String|Error} [error] - Reason for the failure.
 +     */
 +    fail: function() {
 +      return env.fail.apply(env, arguments);
 +    },
 +
 +    /**
 +     * Install a spy onto an existing object.
 +     * @name spyOn
 +     * @since 1.3.0
 +     * @function
 +     * @global
 +     * @param {Object} obj - The object upon which to install the {@link Spy}.
 +     * @param {String} methodName - The name of the method to replace with a {@link Spy}.
 +     * @returns {Spy}
 +     */
 +    spyOn: function(obj, methodName) {
 +      return env.spyOn(obj, methodName);
 +    },
 +
 +    /**
 +     * Install a spy on a property installed with `Object.defineProperty` onto an existing object.
 +     * @name spyOnProperty
 +     * @since 2.6.0
 +     * @function
 +     * @global
 +     * @param {Object} obj - The object upon which to install the {@link Spy}
 +     * @param {String} propertyName - The name of the property to replace with a {@link Spy}.
 +     * @param {String} [accessType=get] - The access type (get|set) of the property to {@link Spy} on.
 +     * @returns {Spy}
 +     */
 +    spyOnProperty: function(obj, methodName, accessType) {
 +      return env.spyOnProperty(obj, methodName, accessType);
 +    },
 +
 +    /**
 +     * Installs spies on all writable and configurable properties of an object.
 +     * @name spyOnAllFunctions
 +     * @since 3.2.1
 +     * @function
 +     * @global
 +     * @param {Object} obj - The object upon which to install the {@link Spy}s
 +     * @param {boolean} includeNonEnumerable - Whether or not to add spies to non-enumerable properties
 +     * @returns {Object} the spied object
 +     */
 +    spyOnAllFunctions: function(obj, includeNonEnumerable) {
 +      return env.spyOnAllFunctions(obj, includeNonEnumerable);
 +    },
 +
 +    jsApiReporter: new jasmine.JsApiReporter({
 +      timer: new jasmine.Timer()
 +    }),
 +
 +    /**
 +     * @namespace jasmine
 +     */
 +    jasmine: jasmine
 +  };
 +
 +  /**
 +   * Add a custom equality tester for the current scope of specs.
 +   *
 +   * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}.
 +   * @name jasmine.addCustomEqualityTester
 +   * @since 2.0.0
 +   * @function
 +   * @param {Function} tester - A function which takes two arguments to compare and returns a `true` or `false` comparison result if it knows how to compare them, and `undefined` otherwise.
 +   * @see custom_equality
 +   */
 +  jasmine.addCustomEqualityTester = function(tester) {
 +    env.addCustomEqualityTester(tester);
 +  };
 +
 +  /**
 +   * Add custom matchers for the current scope of specs.
 +   *
 +   * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}.
 +   * @name jasmine.addMatchers
 +   * @since 2.0.0
 +   * @function
 +   * @param {Object} matchers - Keys from this object will be the new matcher names.
 +   * @see custom_matcher
 +   */
 +  jasmine.addMatchers = function(matchers) {
 +    return env.addMatchers(matchers);
 +  };
 +
 +  /**
 +   * Add custom async matchers for the current scope of specs.
 +   *
 +   * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}.
 +   * @name jasmine.addAsyncMatchers
 +   * @since 3.5.0
 +   * @function
 +   * @param {Object} matchers - Keys from this object will be the new async matcher names.
 +   * @see custom_matcher
 +   */
 +  jasmine.addAsyncMatchers = function(matchers) {
 +    return env.addAsyncMatchers(matchers);
 +  };
 +
 +  /**
 +   * Add a custom object formatter for the current scope of specs.
 +   *
 +   * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}.
 +   * @name jasmine.addCustomObjectFormatter
 +   * @since 3.6.0
 +   * @function
 +   * @param {Function} formatter - A function which takes a value to format and returns a string if it knows how to format it, and `undefined` otherwise.
 +   * @see custom_object_formatters
 +   */
 +  jasmine.addCustomObjectFormatter = function(formatter) {
 +    return env.addCustomObjectFormatter(formatter);
 +  };
 +
 +  /**
 +   * Get the currently booted mock {Clock} for this Jasmine environment.
 +   * @name jasmine.clock
 +   * @since 2.0.0
 +   * @function
 +   * @returns {Clock}
 +   */
 +  jasmine.clock = function() {
 +    return env.clock;
 +  };
 +
 +  /**
 +   * Create a bare {@link Spy} object. This won't be installed anywhere and will not have any implementation behind it.
 +   * @name jasmine.createSpy
 +   * @since 1.3.0
 +   * @function
 +   * @param {String} [name] - Name to give the spy. This will be displayed in failure messages.
 +   * @param {Function} [originalFn] - Function to act as the real implementation.
 +   * @return {Spy}
 +   */
 +  jasmine.createSpy = function(name, originalFn) {
 +    return env.createSpy(name, originalFn);
 +  };
 +
 +  /**
 +   * Create an object with multiple {@link Spy}s as its members.
 +   * @name jasmine.createSpyObj
 +   * @since 1.3.0
 +   * @function
 +   * @param {String} [baseName] - Base name for the spies in the object.
 +   * @param {String[]|Object} methodNames - Array of method names to create spies for, or Object whose keys will be method names and values the {@link Spy#and#returnValue|returnValue}.
 +   * @param {String[]|Object} [propertyNames] - Array of property names to create spies for, or Object whose keys will be propertynames and values the {@link Spy#and#returnValue|returnValue}.
 +   * @return {Object}
 +   */
 +  jasmine.createSpyObj = function(baseName, methodNames, propertyNames) {
 +    return env.createSpyObj(baseName, methodNames, propertyNames);
 +  };
 +
 +  /**
 +   * Add a custom spy strategy for the current scope of specs.
 +   *
 +   * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}.
 +   * @name jasmine.addSpyStrategy
 +   * @since 3.5.0
 +   * @function
 +   * @param {String} name - The name of the strategy (i.e. what you call from `and`)
 +   * @param {Function} factory - Factory function that returns the plan to be executed.
 +   */
 +  jasmine.addSpyStrategy = function(name, factory) {
 +    return env.addSpyStrategy(name, factory);
 +  };
 +
 +  /**
 +   * Set the default spy strategy for the current scope of specs.
 +   *
 +   * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}.
 +   * @name jasmine.setDefaultSpyStrategy
 +   * @function
 +   * @param {Function} defaultStrategyFn - a function that assigns a strategy
 +   * @example
 +   * beforeEach(function() {
 +   *   jasmine.setDefaultSpyStrategy(and => and.returnValue(true));
 +   * });
 +   */
 +  jasmine.setDefaultSpyStrategy = function(defaultStrategyFn) {
 +    return env.setDefaultSpyStrategy(defaultStrategyFn);
 +  };
 +
 +  return jasmineInterface;
 +};
 +
 +getJasmineRequireObj().Spy = function(j$) {
 +  var nextOrder = (function() {
 +    var order = 0;
 +
 +    return function() {
 +      return order++;
 +    };
 +  })();
 +
 +  var matchersUtil = new j$.MatchersUtil({
 +    customTesters: [],
 +    pp: j$.makePrettyPrinter()
 +  });
 +
 +  /**
 +   * @classdesc _Note:_ Do not construct this directly. Use {@link spyOn},
 +   * {@link spyOnProperty}, {@link jasmine.createSpy}, or
 +   * {@link jasmine.createSpyObj} instead.
 +   * @class Spy
 +   * @hideconstructor
 +   */
 +  function Spy(
 +    name,
 +    originalFn,
 +    customStrategies,
 +    defaultStrategyFn,
 +    getPromise
 +  ) {
 +    var numArgs = typeof originalFn === 'function' ? originalFn.length : 0,
 +      wrapper = makeFunc(numArgs, function(context, args, invokeNew) {
 +        return spy(context, args, invokeNew);
 +      }),
 +      strategyDispatcher = new SpyStrategyDispatcher({
 +        name: name,
 +        fn: originalFn,
 +        getSpy: function() {
 +          return wrapper;
 +        },
 +        customStrategies: customStrategies,
 +        getPromise: getPromise
 +      }),
 +      callTracker = new j$.CallTracker(),
 +      spy = function(context, args, invokeNew) {
 +        /**
 +         * @name Spy.callData
 +         * @property {object} object - `this` context for the invocation.
 +         * @property {number} invocationOrder - Order of the invocation.
 +         * @property {Array} args - The arguments passed for this invocation.
 +         * @property returnValue - The value that was returned from this invocation.
 +         */
 +        var callData = {
 +          object: context,
 +          invocationOrder: nextOrder(),
 +          args: Array.prototype.slice.apply(args)
 +        };
 +
 +        callTracker.track(callData);
 +        var returnValue = strategyDispatcher.exec(context, args, invokeNew);
 +        callData.returnValue = returnValue;
 +
 +        return returnValue;
 +      };
 +
 +    function makeFunc(length, fn) {
 +      switch (length) {
 +        case 1:
 +          return function wrap1(a) {
 +            return fn(this, arguments, this instanceof wrap1);
 +          };
 +        case 2:
 +          return function wrap2(a, b) {
 +            return fn(this, arguments, this instanceof wrap2);
 +          };
 +        case 3:
 +          return function wrap3(a, b, c) {
 +            return fn(this, arguments, this instanceof wrap3);
 +          };
 +        case 4:
 +          return function wrap4(a, b, c, d) {
 +            return fn(this, arguments, this instanceof wrap4);
 +          };
 +        case 5:
 +          return function wrap5(a, b, c, d, e) {
 +            return fn(this, arguments, this instanceof wrap5);
 +          };
 +        case 6:
 +          return function wrap6(a, b, c, d, e, f) {
 +            return fn(this, arguments, this instanceof wrap6);
 +          };
 +        case 7:
 +          return function wrap7(a, b, c, d, e, f, g) {
 +            return fn(this, arguments, this instanceof wrap7);
 +          };
 +        case 8:
 +          return function wrap8(a, b, c, d, e, f, g, h) {
 +            return fn(this, arguments, this instanceof wrap8);
 +          };
 +        case 9:
 +          return function wrap9(a, b, c, d, e, f, g, h, i) {
 +            return fn(this, arguments, this instanceof wrap9);
 +          };
 +        default:
 +          return function wrap() {
 +            return fn(this, arguments, this instanceof wrap);
 +          };
 +      }
 +    }
 +
 +    for (var prop in originalFn) {
 +      if (prop === 'and' || prop === 'calls') {
 +        throw new Error(
 +          "Jasmine spies would overwrite the 'and' and 'calls' properties on the object being spied upon"
 +        );
 +      }
 +
 +      wrapper[prop] = originalFn[prop];
 +    }
 +
 +    /**
 +     * @member {SpyStrategy} - Accesses the default strategy for the spy. This strategy will be used
 +     * whenever the spy is called with arguments that don't match any strategy
 +     * created with {@link Spy#withArgs}.
 +     * @name Spy#and
 +     * @since 2.0.0
 +     * @example
 +     * spyOn(someObj, 'func').and.returnValue(42);
 +     */
 +    wrapper.and = strategyDispatcher.and;
 +    /**
 +     * Specifies a strategy to be used for calls to the spy that have the
 +     * specified arguments.
 +     * @name Spy#withArgs
 +     * @since 3.0.0
 +     * @function
 +     * @param {...*} args - The arguments to match
 +     * @type {SpyStrategy}
 +     * @example
 +     * spyOn(someObj, 'func').withArgs(1, 2, 3).and.returnValue(42);
 +     * someObj.func(1, 2, 3); // returns 42
 +     */
 +    wrapper.withArgs = function() {
 +      return strategyDispatcher.withArgs.apply(strategyDispatcher, arguments);
 +    };
 +    wrapper.calls = callTracker;
 +
 +    if (defaultStrategyFn) {
 +      defaultStrategyFn(wrapper.and);
 +    }
 +
 +    return wrapper;
 +  }
 +
 +  function SpyStrategyDispatcher(strategyArgs) {
 +    var baseStrategy = new j$.SpyStrategy(strategyArgs);
 +    var argsStrategies = new StrategyDict(function() {
 +      return new j$.SpyStrategy(strategyArgs);
 +    });
 +
 +    this.and = baseStrategy;
 +
 +    this.exec = function(spy, args, invokeNew) {
 +      var strategy = argsStrategies.get(args);
 +
 +      if (!strategy) {
 +        if (argsStrategies.any() && !baseStrategy.isConfigured()) {
 +          throw new Error(
 +            "Spy '" +
 +              strategyArgs.name +
 +              "' received a call with arguments " +
-               j$.pp(Array.prototype.slice.call(args)) +
++              j$.basicPrettyPrinter_(Array.prototype.slice.call(args)) +
 +              ' but all configured strategies specify other arguments.'
 +          );
 +        } else {
 +          strategy = baseStrategy;
 +        }
 +      }
 +
 +      return strategy.exec(spy, args, invokeNew);
 +    };
 +
 +    this.withArgs = function() {
 +      return { and: argsStrategies.getOrCreate(arguments) };
 +    };
 +  }
 +
 +  function StrategyDict(strategyFactory) {
 +    this.strategies = [];
 +    this.strategyFactory = strategyFactory;
 +  }
 +
 +  StrategyDict.prototype.any = function() {
 +    return this.strategies.length > 0;
 +  };
 +
 +  StrategyDict.prototype.getOrCreate = function(args) {
 +    var strategy = this.get(args);
 +
 +    if (!strategy) {
 +      strategy = this.strategyFactory();
 +      this.strategies.push({
 +        args: args,
 +        strategy: strategy
 +      });
 +    }
 +
 +    return strategy;
 +  };
 +
 +  StrategyDict.prototype.get = function(args) {
 +    var i;
 +
 +    for (i = 0; i < this.strategies.length; i++) {
 +      if (matchersUtil.equals(args, this.strategies[i].args)) {
 +        return this.strategies[i].strategy;
 +      }
 +    }
 +  };
 +
 +  return Spy;
 +};
 +
 +getJasmineRequireObj().SpyFactory = function(j$) {
 +  function SpyFactory(getCustomStrategies, getDefaultStrategyFn, getPromise) {
 +    var self = this;
 +
 +    this.createSpy = function(name, originalFn) {
 +      return j$.Spy(
 +        name,
 +        originalFn,
 +        getCustomStrategies(),
 +        getDefaultStrategyFn(),
 +        getPromise
 +      );
 +    };
 +
 +    this.createSpyObj = function(baseName, methodNames, propertyNames) {
 +      var baseNameIsCollection =
 +        j$.isObject_(baseName) || j$.isArray_(baseName);
 +
 +      if (baseNameIsCollection) {
 +        propertyNames = methodNames;
 +        methodNames = baseName;
 +        baseName = 'unknown';
 +      }
 +
 +      var obj = {};
 +      var spy, descriptor;
 +
 +      var methods = normalizeKeyValues(methodNames);
 +      for (var i = 0; i < methods.length; i++) {
 +        spy = obj[methods[i][0]] = self.createSpy(
 +          baseName + '.' + methods[i][0]
 +        );
 +        if (methods[i].length > 1) {
 +          spy.and.returnValue(methods[i][1]);
 +        }
 +      }
 +
 +      var properties = normalizeKeyValues(propertyNames);
 +      for (var i = 0; i < properties.length; i++) {
 +        descriptor = {
 +          enumerable: true,
 +          get: self.createSpy(baseName + '.' + properties[i][0] + '.get'),
 +          set: self.createSpy(baseName + '.' + properties[i][0] + '.set')
 +        };
 +        if (properties[i].length > 1) {
 +          descriptor.get.and.returnValue(properties[i][1]);
 +          descriptor.set.and.returnValue(properties[i][1]);
 +        }
 +        Object.defineProperty(obj, properties[i][0], descriptor);
 +      }
 +
 +      if (methods.length === 0 && properties.length === 0) {
 +        throw 'createSpyObj requires a non-empty array or object of method names to create spies for';
 +      }
 +
 +      return obj;
 +    };
 +  }
 +
 +  function normalizeKeyValues(object) {
 +    var result = [];
 +    if (j$.isArray_(object)) {
 +      for (var i = 0; i < object.length; i++) {
 +        result.push([object[i]]);
 +      }
 +    } else if (j$.isObject_(object)) {
 +      for (var key in object) {
 +        if (object.hasOwnProperty(key)) {
 +          result.push([key, object[key]]);
 +        }
 +      }
 +    }
 +    return result;
 +  }
 +
 +  return SpyFactory;
 +};
 +
 +getJasmineRequireObj().SpyRegistry = function(j$) {
 +  var spyOnMsg = j$.formatErrorMsg('<spyOn>', 'spyOn(<object>, <methodName>)');
 +  var spyOnPropertyMsg = j$.formatErrorMsg(
 +    '<spyOnProperty>',
 +    'spyOnProperty(<object>, <propName>, [accessType])'
 +  );
 +
 +  function SpyRegistry(options) {
 +    options = options || {};
 +    var global = options.global || j$.getGlobal();
 +    var createSpy = options.createSpy;
 +    var currentSpies =
 +      options.currentSpies ||
 +      function() {
 +        return [];
 +      };
 +
 +    this.allowRespy = function(allow) {
 +      this.respy = allow;
 +    };
 +
 +    this.spyOn = function(obj, methodName) {
 +      var getErrorMsg = spyOnMsg;
 +
 +      if (j$.util.isUndefined(obj) || obj === null) {
 +        throw new Error(
 +          getErrorMsg(
 +            'could not find an object to spy upon for ' + methodName + '()'
 +          )
 +        );
 +      }
 +
 +      if (j$.util.isUndefined(methodName) || methodName === null) {
 +        throw new Error(getErrorMsg('No method name supplied'));
 +      }
 +
 +      if (j$.util.isUndefined(obj[methodName])) {
 +        throw new Error(getErrorMsg(methodName + '() method does not exist'));
 +      }
 +
 +      if (obj[methodName] && j$.isSpy(obj[methodName])) {
 +        if (this.respy) {
 +          return obj[methodName];
 +        } else {
 +          throw new Error(
 +            getErrorMsg(methodName + ' has already been spied upon')
 +          );
 +        }
 +      }
 +
 +      var descriptor = Object.getOwnPropertyDescriptor(obj, methodName);
 +
 +      if (descriptor && !(descriptor.writable || descriptor.set)) {
 +        throw new Error(
 +          getErrorMsg(methodName + ' is not declared writable or has no setter')
 +        );
 +      }
 +
 +      var originalMethod = obj[methodName],
 +        spiedMethod = createSpy(methodName, originalMethod),
 +        restoreStrategy;
 +
 +      if (
 +        Object.prototype.hasOwnProperty.call(obj, methodName) ||
 +        (obj === global && methodName === 'onerror')
 +      ) {
 +        restoreStrategy = function() {
 +          obj[methodName] = originalMethod;
 +        };
 +      } else {
 +        restoreStrategy = function() {
 +          if (!delete obj[methodName]) {
 +            obj[methodName] = originalMethod;
 +          }
 +        };
 +      }
 +
 +      currentSpies().push({
 +        restoreObjectToOriginalState: restoreStrategy
 +      });
 +
 +      obj[methodName] = spiedMethod;
 +
 +      return spiedMethod;
 +    };
 +
 +    this.spyOnProperty = function(obj, propertyName, accessType) {
 +      var getErrorMsg = spyOnPropertyMsg;
 +
 +      accessType = accessType || 'get';
 +
 +      if (j$.util.isUndefined(obj)) {
 +        throw new Error(
 +          getErrorMsg(
 +            'spyOn could not find an object to spy upon for ' +
 +              propertyName +
 +              ''
 +          )
 +        );
 +      }
 +
 +      if (j$.util.isUndefined(propertyName)) {
 +        throw new Error(getErrorMsg('No property name supplied'));
 +      }
 +
 +      var descriptor = j$.util.getPropertyDescriptor(obj, propertyName);
 +
 +      if (!descriptor) {
 +        throw new Error(getErrorMsg(propertyName + ' property does not exist'));
 +      }
 +
 +      if (!descriptor.configurable) {
 +        throw new Error(
 +          getErrorMsg(propertyName + ' is not declared configurable')
 +        );
 +      }
 +
 +      if (!descriptor[accessType]) {
 +        throw new Error(
 +          getErrorMsg(
 +            'Property ' +
 +              propertyName +
 +              ' does not have access type ' +
 +              accessType
 +          )
 +        );
 +      }
 +
 +      if (j$.isSpy(descriptor[accessType])) {
 +        if (this.respy) {
 +          return descriptor[accessType];
 +        } else {
 +          throw new Error(
 +            getErrorMsg(
 +              propertyName + '#' + accessType + ' has already been spied upon'
 +            )
 +          );
 +        }
 +      }
 +
 +      var originalDescriptor = j$.util.clone(descriptor),
 +        spy = createSpy(propertyName, descriptor[accessType]),
 +        restoreStrategy;
 +
 +      if (Object.prototype.hasOwnProperty.call(obj, propertyName)) {
 +        restoreStrategy = function() {
 +          Object.defineProperty(obj, propertyName, originalDescriptor);
 +        };
 +      } else {
 +        restoreStrategy = function() {
 +          delete obj[propertyName];
 +        };
 +      }
 +
 +      currentSpies().push({
 +        restoreObjectToOriginalState: restoreStrategy
 +      });
 +
 +      descriptor[accessType] = spy;
 +
 +      Object.defineProperty(obj, propertyName, descriptor);
 +
 +      return spy;
 +    };
 +
 +    this.spyOnAllFunctions = function(obj, includeNonEnumerable) {
 +      if (j$.util.isUndefined(obj)) {
 +        throw new Error(
 +          'spyOnAllFunctions could not find an object to spy upon'
 +        );
 +      }
 +
 +      var pointer = obj,
 +        propsToSpyOn = [],
 +        properties,
 +        propertiesToSkip = [];
 +
 +      while (
 +        pointer &&
 +        (!includeNonEnumerable || pointer !== Object.prototype)
 +      ) {
 +        properties = getProps(pointer, includeNonEnumerable);
 +        properties = properties.filter(function(prop) {
 +          return propertiesToSkip.indexOf(prop) === -1;
 +        });
 +        propertiesToSkip = propertiesToSkip.concat(properties);
 +        propsToSpyOn = propsToSpyOn.concat(
 +          getSpyableFunctionProps(pointer, properties)
 +        );
 +        pointer = Object.getPrototypeOf(pointer);
 +      }
 +
 +      for (var i = 0; i < propsToSpyOn.length; i++) {
 +        this.spyOn(obj, propsToSpyOn[i]);
 +      }
 +
 +      return obj;
 +    };
 +
 +    this.clearSpies = function() {
 +      var spies = currentSpies();
 +      for (var i = spies.length - 1; i >= 0; i--) {
 +        var spyEntry = spies[i];
 +        spyEntry.restoreObjectToOriginalState();
 +      }
 +    };
 +  }
 +
 +  function getProps(obj, includeNonEnumerable) {
 +    var enumerableProperties = Object.keys(obj);
 +
 +    if (!includeNonEnumerable) {
 +      return enumerableProperties;
 +    }
 +
 +    return Object.getOwnPropertyNames(obj).filter(function(prop) {
 +      return (
 +        prop !== 'constructor' ||
 +        enumerableProperties.indexOf('constructor') > -1
 +      );
 +    });
 +  }
 +
 +  function getSpyableFunctionProps(obj, propertiesToCheck) {
 +    var props = [],
 +      prop;
 +    for (var i = 0; i < propertiesToCheck.length; i++) {
 +      prop = propertiesToCheck[i];
 +      if (
 +        Object.prototype.hasOwnProperty.call(obj, prop) &&
 +        isSpyableProp(obj, prop)
 +      ) {
 +        props.push(prop);
 +      }
 +    }
 +    return props;
 +  }
 +
 +  function isSpyableProp(obj, prop) {
 +    var value, descriptor;
 +    try {
 +      value = obj[prop];
 +    } catch (e) {
 +      return false;
 +    }
 +    if (value instanceof Function) {
 +      descriptor = Object.getOwnPropertyDescriptor(obj, prop);
 +      return (descriptor.writable || descriptor.set) && descriptor.configurable;
 +    }
 +    return false;
 +  }
 +
 +  return SpyRegistry;
 +};
 +
 +getJasmineRequireObj().SpyStrategy = function(j$) {
 +  /**
 +   * @interface SpyStrategy
 +   */
 +  function SpyStrategy(options) {
 +    options = options || {};
 +
 +    var self = this;
 +
 +    /**
 +     * Get the identifying information for the spy.
 +     * @name SpyStrategy#identity
 +     * @since 3.0.0
 +     * @member
 +     * @type {String}
 +     */
 +    this.identity = options.name || 'unknown';
 +    this.originalFn = options.fn || function() {};
 +    this.getSpy = options.getSpy || function() {};
 +    this.plan = this._defaultPlan = function() {};
 +
 +    var k,
 +      cs = options.customStrategies || {};
 +    for (k in cs) {
 +      if (j$.util.has(cs, k) && !this[k]) {
 +        this[k] = createCustomPlan(cs[k]);
 +      }
 +    }
 +
 +    var getPromise =
 +      typeof options.getPromise === 'function'
 +        ? options.getPromise
 +        : function() {};
 +
 +    var requirePromise = function(name) {
 +      var Promise = getPromise();
 +
 +      if (!Promise) {
 +        throw new Error(
 +          name +
 +            ' requires global Promise, or `Promise` configured with `jasmine.getEnv().configure()`'
 +        );
 +      }
 +
 +      return Promise;
 +    };
 +
 +    /**
 +     * Tell the spy to return a promise resolving to the specified value when invoked.
 +     * @name SpyStrategy#resolveTo
 +     * @since 3.5.0
 +     * @function
 +     * @param {*} value The value to return.
 +     */
 +    this.resolveTo = function(value) {
 +      var Promise = requirePromise('resolveTo');
 +      self.plan = function() {
 +        return Promise.resolve(value);
 +      };
 +      return self.getSpy();
 +    };
 +
 +    /**
 +     * Tell the spy to return a promise rejecting with the specified value when invoked.
 +     * @name SpyStrategy#rejectWith
 +     * @since 3.5.0
 +     * @function
 +     * @param {*} value The value to return.
 +     */
 +    this.rejectWith = function(value) {
 +      var Promise = requirePromise('rejectWith');
 +
 +      self.plan = function() {
 +        return Promise.reject(value);
 +      };
 +      return self.getSpy();
 +    };
 +  }
 +
 +  function createCustomPlan(factory) {
 +    return function() {
 +      var plan = factory.apply(null, arguments);
 +
 +      if (!j$.isFunction_(plan)) {
 +        throw new Error('Spy strategy must return a function');
 +      }
 +
 +      this.plan = plan;
 +      return this.getSpy();
 +    };
 +  }
 +
 +  /**
 +   * Execute the current spy strategy.
 +   * @name SpyStrategy#exec
 +   * @since 2.0.0
 +   * @function
 +   */
 +  SpyStrategy.prototype.exec = function(context, args, invokeNew) {
 +    var contextArgs = [context].concat(
 +      args ? Array.prototype.slice.call(args) : []
 +    );
 +    var target = this.plan.bind.apply(this.plan, contextArgs);
 +
 +    return invokeNew ? new target() : target();
 +  };
 +
 +  /**
 +   * Tell the spy to call through to the real implementation when invoked.
 +   * @name SpyStrategy#callThrough
 +   * @since 2.0.0
 +   * @function
 +   */
 +  SpyStrategy.prototype.callThrough = function() {
 +    this.plan = this.originalFn;
 +    return this.getSpy();
 +  };
 +
 +  /**
 +   * Tell the spy to return the value when invoked.
 +   * @name SpyStrategy#returnValue
 +   * @since 2.0.0
 +   * @function
 +   * @param {*} value The value to return.
 +   */
 +  SpyStrategy.prototype.returnValue = function(value) {
 +    this.plan = function() {
 +      return value;
 +    };
 +    return this.getSpy();
 +  };
 +
 +  /**
 +   * Tell the spy to return one of the specified values (sequentially) each time the spy is invoked.
 +   * @name SpyStrategy#returnValues
 +   * @since 2.1.0
 +   * @function
 +   * @param {...*} values - Values to be returned on subsequent calls to the spy.
 +   */
 +  SpyStrategy.prototype.returnValues = function() {
 +    var values = Array.prototype.slice.call(arguments);
 +    this.plan = function() {
 +      return values.shift();
 +    };
 +    return this.getSpy();
 +  };
 +
 +  /**
 +   * Tell the spy to throw an error when invoked.
 +   * @name SpyStrategy#throwError
 +   * @since 2.0.0
 +   * @function
 +   * @param {Error|Object|String} something Thing to throw
 +   */
 +  SpyStrategy.prototype.throwError = function(something) {
 +    var error = j$.isString_(something) ? new Error(something) : something;
 +    this.plan = function() {
 +      throw error;
 +    };
 +    return this.getSpy();
 +  };
 +
 +  /**
 +   * Tell the spy to call a fake implementation when invoked.
 +   * @name SpyStrategy#callFake
 +   * @since 2.0.0
 +   * @function
 +   * @param {Function} fn The function to invoke with the passed parameters.
 +   */
 +  SpyStrategy.prototype.callFake = function(fn) {
 +    if (
 +      !(
 +        j$.isFunction_(fn) ||
 +        j$.isAsyncFunction_(fn) ||
 +        j$.isGeneratorFunction_(fn)
 +      )
 +    ) {
 +      throw new Error(
 +        'Argument passed to callFake should be a function, got ' + fn
 +      );
 +    }
 +    this.plan = fn;
 +    return this.getSpy();
 +  };
 +
 +  /**
 +   * Tell the spy to do nothing when invoked. This is the default.
 +   * @name SpyStrategy#stub
 +   * @since 2.0.0
 +   * @function
 +   */
 +  SpyStrategy.prototype.stub = function(fn) {
 +    this.plan = function() {};
 +    return this.getSpy();
 +  };
 +
 +  SpyStrategy.prototype.isConfigured = function() {
 +    return this.plan !== this._defaultPlan;
 +  };
 +
 +  return SpyStrategy;
 +};
 +
 +getJasmineRequireObj().StackTrace = function(j$) {
 +  function StackTrace(error) {
 +    var lines = error.stack.split('\n').filter(function(line) {
 +      return line !== '';
 +    });
 +
 +    var extractResult = extractMessage(error.message, lines);
 +
 +    if (extractResult) {
 +      this.message = extractResult.message;
 +      lines = extractResult.remainder;
 +    }
 +
 +    var parseResult = tryParseFrames(lines);
 +    this.frames = parseResult.frames;
 +    this.style = parseResult.style;
 +  }
 +
 +  var framePatterns = [
 +    // PhantomJS on Linux, Node, Chrome, IE, Edge
 +    // e.g. "   at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)"
 +    // Note that the "function name" can include a surprisingly large set of
 +    // characters, including angle brackets and square brackets.
 +    {
 +      re: /^\s*at ([^\)]+) \(([^\)]+)\)$/,
 +      fnIx: 1,
 +      fileLineColIx: 2,
 +      style: 'v8'
 +    },
 +
 +    // NodeJS alternate form, often mixed in with the Chrome style
 +    // e.g. "  at /some/path:4320:20
 +    { re: /\s*at (.+)$/, fileLineColIx: 1, style: 'v8' },
 +
 +    // PhantomJS on OS X, Safari, Firefox
 +    // e.g. "run@http://localhost:8888/__jasmine__/jasmine.js:4320:27"
 +    // or "http://localhost:8888/__jasmine__/jasmine.js:4320:27"
 +    {
 +      re: /^(([^@\s]+)@)?([^\s]+)$/,
 +      fnIx: 2,
 +      fileLineColIx: 3,
 +      style: 'webkit'
 +    }
 +  ];
 +
 +  // regexes should capture the function name (if any) as group 1
 +  // and the file, line, and column as group 2.
 +  function tryParseFrames(lines) {
 +    var style = null;
 +    var frames = lines.map(function(line) {
 +      var convertedLine = first(framePatterns, function(pattern) {
 +        var overallMatch = line.match(pattern.re),
 +          fileLineColMatch;
 +        if (!overallMatch) {
 +          return null;
 +        }
 +
 +        fileLineColMatch = overallMatch[pattern.fileLineColIx].match(
 +          /^(.*):(\d+):\d+$/
 +        );
 +        if (!fileLineColMatch) {
 +          return null;
 +        }
 +
 +        style = style || pattern.style;
 +        return {
 +          raw: line,
 +          file: fileLineColMatch[1],
 +          line: parseInt(fileLineColMatch[2], 10),
 +          func: overallMatch[pattern.fnIx]
 +        };
 +      });
 +
 +      return convertedLine || { raw: line };
 +    });
 +
 +    return {
 +      style: style,
 +      frames: frames
 +    };
 +  }
 +
 +  function first(items, fn) {
 +    var i, result;
 +
 +    for (i = 0; i < items.length; i++) {
 +      result = fn(items[i]);
 +
 +      if (result) {
 +        return result;
 +      }
 +    }
 +  }
 +
 +  function extractMessage(message, stackLines) {
 +    var len = messagePrefixLength(message, stackLines);
 +
 +    if (len > 0) {
 +      return {
 +        message: stackLines.slice(0, len).join('\n'),
 +        remainder: stackLines.slice(len)
 +      };
 +    }
 +  }
 +
 +  function messagePrefixLength(message, stackLines) {
 +    if (!stackLines[0].match(/^\w*Error/)) {
 +      return 0;
 +    }
 +
 +    var messageLines = message.split('\n');
 +    var i;
 +
 +    for (i = 1; i < messageLines.length; i++) {
 +      if (messageLines[i] !== stackLines[i]) {
 +        return 0;
 +      }
 +    }
 +
 +    return messageLines.length;
 +  }
 +
 +  return StackTrace;
 +};
 +
 +getJasmineRequireObj().Suite = function(j$) {
 +  /**
 +   * @interface Suite
 +   * @see Env#topSuite
 +   * @since 2.0.0
 +   */
 +  function Suite(attrs) {
 +    this.env = attrs.env;
 +    /**
 +     * The unique ID of this suite.
 +     * @name Suite#id
 +     * @readonly
 +     * @type {string}
 +     * @since 2.0.0
 +     */
 +    this.id = attrs.id;
 +    /**
 +     * The parent of this suite, or null if this is the top suite.
 +     * @name Suite#parentSuite
 +     * @readonly
 +     * @type {Suite}
 +     */
 +    this.parentSuite = attrs.parentSuite;
 +    /**
 +     * The description passed to the {@link describe} that created this suite.
 +     * @name Suite#description
 +     * @readonly
 +     * @type {string}
 +     * @since 2.0.0
 +     */
 +    this.description = attrs.description;
 +    this.expectationFactory = attrs.expectationFactory;
 +    this.asyncExpectationFactory = attrs.asyncExpectationFactory;
 +    this.expectationResultFactory = attrs.expectationResultFactory;
 +    this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure;
 +    this.autoCleanClosures =
 +      attrs.autoCleanClosures === undefined ? true : !!attrs.autoCleanClosures;
 +
 +    this.beforeFns = [];
 +    this.afterFns = [];
 +    this.beforeAllFns = [];
 +    this.afterAllFns = [];
 +
 +    this.timer = attrs.timer || new j$.Timer();
 +
 +    /**
 +     * The suite's children.
 +     * @name Suite#children
 +     * @type {Array.<(Spec|Suite)>}
 +     * @since 2.0.0
 +     */
 +    this.children = [];
 +
 +    this.reset();
 +  }
 +
 +  Suite.prototype.setSuiteProperty = function(key, value) {
 +    this.result.properties = this.result.properties || {};
 +    this.result.properties[key] = value;
 +  };
 +
 +  Suite.prototype.expect = function(actual) {
 +    return this.expectationFactory(actual, this);
 +  };
 +
 +  Suite.prototype.expectAsync = function(actual) {
 +    return this.asyncExpectationFactory(actual, this);
 +  };
 +
 +  /**
 +   * The full description including all ancestors of this suite.
 +   * @name Suite#getFullName
 +   * @function
 +   * @returns {string}
 +   * @since 2.0.0
 +   */
 +  Suite.prototype.getFullName = function() {
 +    var fullName = [];
 +    for (
 +      var parentSuite = this;
 +      parentSuite;
 +      parentSuite = parentSuite.parentSuite
 +    ) {
 +      if (parentSuite.parentSuite) {
 +        fullName.unshift(parentSuite.description);
 +      }
 +    }
 +    return fullName.join(' ');
 +  };
 +
 +  /*
 +   * Mark the suite with "pending" status
 +   */
 +  Suite.prototype.pend = function() {
 +    this.markedPending = true;
 +  };
 +
 +  /*
 +   * Like {@link Suite#pend}, but pending state will survive {@link Spec#reset}
 +   * Useful for fdescribe, xdescribe, where pending state should remain.
 +   */
 +  Suite.prototype.exclude = function() {
 +    this.pend();
 +    this.markedExcluding = true;
 +  };
 +
 +  Suite.prototype.beforeEach = function(fn) {
 +    this.beforeFns.unshift(fn);
 +  };
 +
 +  Suite.prototype.beforeAll = function(fn) {
 +    this.beforeAllFns.push(fn);
 +  };
 +
 +  Suite.prototype.afterEach = function(fn) {
 +    this.afterFns.unshift(fn);
 +  };
 +
 +  Suite.prototype.afterAll = function(fn) {
 +    this.afterAllFns.unshift(fn);
 +  };
 +
 +  Suite.prototype.startTimer = function() {
 +    this.timer.start();
 +  };
 +
 +  Suite.prototype.endTimer = function() {
 +    this.result.duration = this.timer.elapsed();
 +  };
 +
 +  function removeFns(queueableFns) {
 +    for (var i = 0; i < queueableFns.length; i++) {
 +      queueableFns[i].fn = null;
 +    }
 +  }
 +
 +  Suite.prototype.cleanupBeforeAfter = function() {
 +    if (this.autoCleanClosures) {
 +      removeFns(this.beforeAllFns);
 +      removeFns(this.afterAllFns);
 +      removeFns(this.beforeFns);
 +      removeFns(this.afterFns);
 +    }
 +  };
 +
 +  Suite.prototype.reset = function() {
 +    /**
 +     * @typedef SuiteResult
 +     * @property {Int} id - The unique id of this suite.
 +     * @property {String} description - The description text passed to the {@link describe} that made this suite.
 +     * @property {String} fullName - The full description including all ancestors of this suite.
 +     * @property {Expectation[]} failedExpectations - The list of expectations that failed in an {@link afterAll} for this suite.
 +     * @property {Expectation[]} deprecationWarnings - The list of deprecation warnings that occurred on this suite.
 +     * @property {String} status - Once the suite has completed, this string represents the pass/fail status of this suite.
 +     * @property {number} duration - The time in ms for Suite execution, including any before/afterAll, before/afterEach.
 +     * @property {Object} properties - User-supplied properties, if any, that were set using {@link Env#setSuiteProperty}
 +     * @since 2.0.0
 +     */
 +    this.result = {
 +      id: this.id,
 +      description: this.description,
 +      fullName: this.getFullName(),
 +      failedExpectations: [],
 +      deprecationWarnings: [],
 +      duration: null,
 +      properties: null
 +    };
 +    this.markedPending = this.markedExcluding;
 +    this.children.forEach(function(child) {
 +      child.reset();
 +    });
 +  };
 +
 +  Suite.prototype.addChild = function(child) {
 +    this.children.push(child);
 +  };
 +
 +  Suite.prototype.status = function() {
 +    if (this.markedPending) {
 +      return 'pending';
 +    }
 +
 +    if (this.result.failedExpectations.length > 0) {
 +      return 'failed';
 +    } else {
 +      return 'passed';
 +    }
 +  };
 +
 +  Suite.prototype.canBeReentered = function() {
 +    return this.beforeAllFns.length === 0 && this.afterAllFns.length === 0;
 +  };
 +
 +  Suite.prototype.getResult = function() {
 +    this.result.status = this.status();
 +    return this.result;
 +  };
 +
 +  Suite.prototype.sharedUserContext = function() {
 +    if (!this.sharedContext) {
 +      this.sharedContext = this.parentSuite
 +        ? this.parentSuite.clonedSharedUserContext()
 +        : new j$.UserContext();
 +    }
 +
 +    return this.sharedContext;
 +  };
 +
 +  Suite.prototype.clonedSharedUserContext = function() {
 +    return j$.UserContext.fromExisting(this.sharedUserContext());
 +  };
 +
 +  Suite.prototype.onException = function() {
 +    if (arguments[0] instanceof j$.errors.ExpectationFailed) {
 +      return;
 +    }
 +
 +    var data = {
 +      matcherName: '',
 +      passed: false,
 +      expected: '',
 +      actual: '',
 +      error: arguments[0]
 +    };
 +    var failedExpectation = this.expectationResultFactory(data);
 +
 +    if (!this.parentSuite) {
 +      failedExpectation.globalErrorType = 'afterAll';
 +    }
 +
 +    this.result.failedExpectations.push(failedExpectation);
 +  };
 +
++  Suite.prototype.onMultipleDone = function() {
++    var msg;
++
++    // Issue a deprecation. Include the context ourselves and pass
++    // ignoreRunnable: true, since getting here always means that we've already
++    // moved on and the current runnable isn't the one that caused the problem.
++    if (this.parentSuite) {
++      msg =
++        "An asynchronous function called its 'done' callback more than " +
++        'once. This is a bug in the spec, beforeAll, beforeEach, afterAll, ' +
++        'or afterEach function in question. This will be treated as an error ' +
++        'in a future version. See' +
++        '<https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#deprecations-due-to-calling-done-multiple-times> ' +
++        'for more information.\n' +
++        '(in suite: ' +
++        this.getFullName() +
++        ')';
++    } else {
++      msg =
++        'A top-level beforeAll or afterAll function called its ' +
++        "'done' callback more than once. This is a bug in the beforeAll " +
++        'or afterAll function in question. This will be treated as an ' +
++        'error in a future version. See' +
++        '<https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#deprecations-due-to-calling-done-multiple-times> ' +
++        'for more information.';
++    }
++
++    this.env.deprecated(msg, { ignoreRunnable: true });
++  };
++
 +  Suite.prototype.addExpectationResult = function() {
 +    if (isFailure(arguments)) {
 +      var data = arguments[1];
 +      this.result.failedExpectations.push(this.expectationResultFactory(data));
 +      if (this.throwOnExpectationFailure) {
 +        throw new j$.errors.ExpectationFailed();
 +      }
 +    }
 +  };
 +
 +  Suite.prototype.addDeprecationWarning = function(deprecation) {
 +    if (typeof deprecation === 'string') {
 +      deprecation = { message: deprecation };
 +    }
 +    this.result.deprecationWarnings.push(
 +      this.expectationResultFactory(deprecation)
 +    );
 +  };
 +
 +  function isFailure(args) {
 +    return !args[0];
 +  }
 +
 +  return Suite;
 +};
 +
 +if (typeof window == void 0 && typeof exports == 'object') {
 +  /* globals exports */
 +  exports.Suite = jasmineRequire.Suite;
 +}
 +
 +getJasmineRequireObj().Timer = function() {
 +  var defaultNow = (function(Date) {
 +    return function() {
 +      return new Date().getTime();
 +    };
 +  })(Date);
 +
 +  function Timer(options) {
 +    options = options || {};
 +
 +    var now = options.now || defaultNow,
 +      startTime;
 +
 +    this.start = function() {
 +      startTime = now();
 +    };
 +
 +    this.elapsed = function() {
 +      return now() - startTime;
 +    };
 +  }
 +
 +  return Timer;
 +};
 +
 +getJasmineRequireObj().TreeProcessor = function() {
 +  function TreeProcessor(attrs) {
 +    var tree = attrs.tree,
 +      runnableIds = attrs.runnableIds,
 +      queueRunnerFactory = attrs.queueRunnerFactory,
 +      nodeStart = attrs.nodeStart || function() {},
 +      nodeComplete = attrs.nodeComplete || function() {},
 +      failSpecWithNoExpectations = !!attrs.failSpecWithNoExpectations,
 +      orderChildren =
 +        attrs.orderChildren ||
 +        function(node) {
 +          return node.children;
 +        },
 +      excludeNode =
 +        attrs.excludeNode ||
 +        function(node) {
 +          return false;
 +        },
 +      stats = { valid: true },
 +      processed = false,
 +      defaultMin = Infinity,
 +      defaultMax = 1 - Infinity;
 +
 +    this.processTree = function() {
 +      processNode(tree, true);
 +      processed = true;
 +      return stats;
 +    };
 +
 +    this.execute = function(done) {
 +      if (!processed) {
 +        this.processTree();
 +      }
 +
 +      if (!stats.valid) {
 +        throw 'invalid order';
 +      }
 +
 +      var childFns = wrapChildren(tree, 0);
 +
 +      queueRunnerFactory({
 +        queueableFns: childFns,
 +        userContext: tree.sharedUserContext(),
 +        onException: function() {
 +          tree.onException.apply(tree, arguments);
 +        },
-         onComplete: done
++        onComplete: done,
++        onMultipleDone: tree.onMultipleDone
++          ? tree.onMultipleDone.bind(tree)
++          : null
 +      });
 +    };
 +
 +    function runnableIndex(id) {
 +      for (var i = 0; i < runnableIds.length; i++) {
 +        if (runnableIds[i] === id) {
 +          return i;
 +        }
 +      }
 +    }
 +
 +    function processNode(node, parentExcluded) {
 +      var executableIndex = runnableIndex(node.id);
 +
 +      if (executableIndex !== undefined) {
 +        parentExcluded = false;
 +      }
 +
 +      if (!node.children) {
 +        var excluded = parentExcluded || excludeNode(node);
 +        stats[node.id] = {
 +          excluded: excluded,
 +          willExecute: !excluded && !node.markedPending,
 +          segments: [
 +            {
 +              index: 0,
 +              owner: node,
 +              nodes: [node],
 +              min: startingMin(executableIndex),
 +              max: startingMax(executableIndex)
 +            }
 +          ]
 +        };
 +      } else {
 +        var hasExecutableChild = false;
 +
 +        var orderedChildren = orderChildren(node);
 +
 +        for (var i = 0; i < orderedChildren.length; i++) {
 +          var child = orderedChildren[i];
 +
 +          processNode(child, parentExcluded);
 +
 +          if (!stats.valid) {
 +            return;
 +          }
 +
 +          var childStats = stats[child.id];
 +
 +          hasExecutableChild = hasExecutableChild || childStats.willExecute;
 +        }
 +
 +        stats[node.id] = {
 +          excluded: parentExcluded,
 +          willExecute: hasExecutableChild
 +        };
 +
 +        segmentChildren(node, orderedChildren, stats[node.id], executableIndex);
 +
 +        if (!node.canBeReentered() && stats[node.id].segments.length > 1) {
 +          stats = { valid: false };
 +        }
 +      }
 +    }
 +
 +    function startingMin(executableIndex) {
 +      return executableIndex === undefined ? defaultMin : executableIndex;
 +    }
 +
 +    function startingMax(executableIndex) {
 +      return executableIndex === undefined ? defaultMax : executableIndex;
 +    }
 +
 +    function segmentChildren(
 +      node,
 +      orderedChildren,
 +      nodeStats,
 +      executableIndex
 +    ) {
 +      var currentSegment = {
 +          index: 0,
 +          owner: node,
 +          nodes: [],
 +          min: startingMin(executableIndex),
 +          max: startingMax(executableIndex)
 +        },
 +        result = [currentSegment],
 +        lastMax = defaultMax,
 +        orderedChildSegments = orderChildSegments(orderedChildren);
 +
 +      function isSegmentBoundary(minIndex) {
 +        return (
 +          lastMax !== defaultMax &&
 +          minIndex !== defaultMin &&
 +          lastMax < minIndex - 1
 +        );
 +      }
 +
 +      for (var i = 0; i < orderedChildSegments.length; i++) {
 +        var childSegment = orderedChildSegments[i],
 +          maxIndex = childSegment.max,
 +          minIndex = childSegment.min;
 +
 +        if (isSegmentBoundary(minIndex)) {
 +          currentSegment = {
 +            index: result.length,
 +            owner: node,
 +            nodes: [],
 +            min: defaultMin,
 +            max: defaultMax
 +          };
 +          result.push(currentSegment);
 +        }
 +
 +        currentSegment.nodes.push(childSegment);
 +        currentSegment.min = Math.min(currentSegment.min, minIndex);
 +        currentSegment.max = Math.max(currentSegment.max, maxIndex);
 +        lastMax = maxIndex;
 +      }
 +
 +      nodeStats.segments = result;
 +    }
 +
 +    function orderChildSegments(children) {
 +      var specifiedOrder = [],
 +        unspecifiedOrder = [];
 +
 +      for (var i = 0; i < children.length; i++) {
 +        var child = children[i],
 +          segments = stats[child.id].segments;
 +
 +        for (var j = 0; j < segments.length; j++) {
 +          var seg = segments[j];
 +
 +          if (seg.min === defaultMin) {
 +            unspecifiedOrder.push(seg);
 +          } else {
 +            specifiedOrder.push(seg);
 +          }
 +        }
 +      }
 +
 +      specifiedOrder.sort(function(a, b) {
 +        return a.min - b.min;
 +      });
 +
 +      return specifiedOrder.concat(unspecifiedOrder);
 +    }
 +
 +    function executeNode(node, segmentNumber) {
 +      if (node.children) {
 +        return {
 +          fn: function(done) {
 +            var onStart = {
 +              fn: function(next) {
 +                nodeStart(node, next);
 +              }
 +            };
 +
 +            queueRunnerFactory({
 +              onComplete: function() {
 +                var args = Array.prototype.slice.call(arguments, [0]);
 +                node.cleanupBeforeAfter();
 +                nodeComplete(node, node.getResult(), function() {
 +                  done.apply(undefined, args);
 +                });
 +              },
 +              queueableFns: [onStart].concat(wrapChildren(node, segmentNumber)),
 +              userContext: node.sharedUserContext(),
 +              onException: function() {
 +                node.onException.apply(node, arguments);
-               }
++              },
++              onMultipleDone: node.onMultipleDone
++                ? node.onMultipleDone.bind(node)
++                : null
 +            });
 +          }
 +        };
 +      } else {
 +        return {
 +          fn: function(done) {
 +            node.execute(
 +              done,
 +              stats[node.id].excluded,
 +              failSpecWithNoExpectations
 +            );
 +          }
 +        };
 +      }
 +    }
 +
 +    function wrapChildren(node, segmentNumber) {
 +      var result = [],
 +        segmentChildren = stats[node.id].segments[segmentNumber].nodes;
 +
 +      for (var i = 0; i < segmentChildren.length; i++) {
 +        result.push(
 +          executeNode(segmentChildren[i].owner, segmentChildren[i].index)
 +        );
 +      }
 +
 +      if (!stats[node.id].willExecute) {
 +        return result;
 +      }
 +
 +      return node.beforeAllFns.concat(result).concat(node.afterAllFns);
 +    }
 +  }
 +
 +  return TreeProcessor;
 +};
 +
 +getJasmineRequireObj().UserContext = function(j$) {
 +  function UserContext() {}
 +
 +  UserContext.fromExisting = function(oldContext) {
 +    var context = new UserContext();
 +
 +    for (var prop in oldContext) {
 +      if (oldContext.hasOwnProperty(prop)) {
 +        context[prop] = oldContext[prop];
 +      }
 +    }
 +
 +    return context;
 +  };
 +
 +  return UserContext;
 +};
 +
 +getJasmineRequireObj().version = function() {
-   return '3.10.1';
++  return '3.99.1';
 +};
index 7abbbd22103c8ba299e0a6ed1649ec8a33eed5c2,0000000000000000000000000000000000000000..0201235e1e0370e12a65a80f5fbd2e29b829ca2f
mode 100755,000000..100755
--- /dev/null
@@@ -1,5 -1,0 +1,5 @@@
- curl -o jasmine.js https://raw.githubusercontent.com/jasmine/jasmine/v3.10.1/lib/jasmine-core/jasmine.js
- patch <local-modifications.patch jasmine.js
 +# This script is used to build our custom version of the Jasmine library by
 +# downloading the upstream file and applying our patches, and is meant for use
 +# only when upgrading to a new upstream version.
++curl -o jasmine.js https://raw.githubusercontent.com/jasmine/jasmine/v3.99.1/lib/jasmine-core/jasmine.js
++# patch <local-modifications.patch jasmine.js
index f483ac3f9578655735c85e37fb1c0c4ec79738c2,0000000000000000000000000000000000000000..9c25a52308898eff68642ff43878f9e4aa57a86d
mode 100644,000000..100644
--- /dev/null
@@@ -1,99 -1,0 +1,100 @@@
- project('jasmine-gjs', version: '3.10.1', license: 'MIT',
++project('jasmine-gjs', version: '3.99.1', license: 'MIT',
 +    meson_version: '>= 0.58.0')
 +
 +gjs_dep = dependency('gjs-1.0', required: false)
 +if gjs_dep.found()
 +    gjs = find_program(gjs_dep.get_variable('gjs_console'))
 +else
 +    gjs = find_program('gjs', 'gjs-console')
 +endif
 +
 +pkglibexecdir = join_paths(get_option('libexecdir'), meson.project_name())
 +pkgdatadir = join_paths(get_option('datadir'), meson.project_name())
 +jasmine_mod = meson.project_name()
 +
 +uninstalled_pkglibexecdir = meson.current_build_dir()
 +uninstalled_pkgdatadir = join_paths(meson.current_source_dir(), 'src')
 +uninstalled_jasmine_mod = 'lib'
 +
 +# Executables
 +
 +config = configuration_data()
 +if meson.is_subproject()
 +    config.set('pkgdatadir', uninstalled_pkgdatadir)
 +    config.set('pkglibexecdir', uninstalled_pkglibexecdir)
 +    config.set('jasmine_mod', uninstalled_jasmine_mod)
 +else
 +    config.set('pkgdatadir', join_paths(get_option('prefix'), pkgdatadir))
 +    config.set('pkglibexecdir', join_paths(get_option('prefix'), pkglibexecdir))
 +    config.set('jasmine_mod', jasmine_mod)
 +endif
 +config.set('PACKAGE_VERSION', meson.project_version())
 +
 +jasmine = configure_file(configuration: config, input: 'bin/jasmine.in',
 +    output: 'jasmine', install: not meson.is_subproject(), install_dir: 'bin')
 +
- jasmine_runner = configure_file(configuration: config,
++configure_file(configuration: config,
 +    input: 'bin/jasmine-runner.in', output: 'jasmine-runner',
 +    install: not meson.is_subproject(),
 +    install_dir: pkglibexecdir)
 +
 +meson.override_find_program('jasmine', jasmine)
 +
 +# Source code and Jasmine library
 +
 +if not meson.is_subproject()
 +    install_data(
 +        'lib/jasmine.js',
 +        'src/command.js',
 +        'src/config.js',
 +        'src/consoleReporter.js',
 +        'src/jasmineBoot.js',
 +        'src/junitReporter.js',
 +        'src/options.js',
 +        'src/tapReporter.js',
 +        'src/timer.js',
 +        'src/utils.js',
 +        'src/verboseReporter.js',
 +        'src/xmlWriter.js',
 +        install_dir: pkgdatadir,
 +    )
 +endif
 +
 +# Documentation
 +
 +if not meson.is_subproject()
 +    install_data('jasmine.man', rename: 'jasmine.1',
 +        install_dir: join_paths(get_option('datadir'), 'man', 'man1'))
 +endif
 +
 +# Tests
 +
 +tests = [
++    '0_your_first_suite',
++    'custom_matcher',
++
 +    'commandSpec',
 +    'configSpec',
 +    'consoleReporterSpec',
 +    'defaultReporterSpec',
-     'focusedSpecIntegrationTest',
 +    'importerSpec',
 +    'jasmineBootSpec',
-     'jasmineIntegrationTest',
 +    'junitReporterSpec',
 +    'optionsSpec',
 +    'tapReporterSpec',
 +    'timerSpec',
 +    'utilsSpec',
 +    'verboseReporterSpec',
 +    'xmlWriterSpec',
 +]
 +if not meson.is_subproject()
 +    test_env = environment()
 +    test_env.set('TEST_PKGDATADIR', uninstalled_pkgdatadir)
 +    test_env.set('TEST_PKGLIBEXECDIR', uninstalled_pkglibexecdir)
 +    test_env.set('TEST_JASMINE_MOD', uninstalled_jasmine_mod)
 +    foreach t : tests
 +        test_file = files('test/@0@.js'.format(t))
 +        test(t, gjs, args: ['-m', jasmine, test_file, '--module', '--tap', '--no-config'],
 +            env: test_env, protocol: 'tap')
 +    endforeach
 +endif
index c638e642714ef55b68852ba469bfbe27ae0b99b5,0000000000000000000000000000000000000000..475251e7c985c7a63b75d0eb63855e69299daa52
mode 100644,000000..100644
--- /dev/null
@@@ -1,57 -1,0 +1,47 @@@
- - [ ] If making a new major release, update `test/jasmineIntegrationTest.js` and `test/focusedSpecIntegrationTest.js` from `https://github.com/jasmine/jasmine.github.io/tree/master/_versions/<VERSION>/src`.
-       Currently we use `introduction.js`, `custom_equality.js`, `custom_matcher.js`, and `focused_specs.js`, but there may be new features that should be included as well.
-       Strip the documentation comments and the weird indentation.
 +# Release Checklist #
 +
 +## Updating to a new upstream release ##
 +
 +- [ ] Bump version in `meson.build`.
 +- [ ] Change upstream Jasmine version in the `lib/update-jasmine.sh` script.
 +- [ ] Delete `lib/jasmine.js`.
 +- [ ] Run `cd lib; ./update-jasmine.sh` to regenerate `lib/jasmine.js` from the new upstream version.
 +- [ ] Resolve patch conflicts with the new upstream version if necessary.
- ## Releasing: OBS ##
++- [ ] If making a new major release, update `test/jasmineIntegrationTest.js` and `test/focusedSpecIntegrationTest.js` from the appropriate point in the history of `https://github.com/jasmine/jasmine.github.io/tree/d9b48e17/_tutorials/src`.
++      Currently we use `0_your_first_suite.js` and `custom_matcher.js`, but there may be new features that should be included as well.
++      Remove the browser feature detection and put the "long asynchronous suite" test inside a check for an environment variable.
 +- [ ] If making a new major release, see if there are any new features that we can use to improve jasmine-gjs's own tests.
 +- [ ] Run `meson test`.
 +- [ ] Make a commit.
 +- [ ] Write release notes in `NEWS.md`.
 +
 +## Packaging: RPM ##
 +
 +- [ ] Update the version number in `jasmine-gjs.spec`.
 +- [ ] Add a changelog entry in `jasmine-gjs.spec`.
 +- [ ] Make any other necessary changes to `jasmine-gjs.spec`.
 +- [ ] Run `ninja dist`.
 +- [ ] Copy `jasmine-gjs-<VERSION>.tar.xz` to `rpmbuild/SOURCES`.
 +- [ ] Copy `jasmine-gjs.spec` to `rpmbuild/SPECS`.
 +- [ ] Run `rpmbuild -ba /path/to/rpmbuild/SPECS/jasmine-gjs.spec` to ensure that everything builds OK.
 +- [ ] Make a commit.
 +
 +## Packaging: Debian ##
 +
 +- [ ] Update the changelog with `dch`. (Distribution = `unstable`)
 +- [ ] Make any other necessary changes to the `debian` directory.
 +- [ ] Run `debuild -uc -us -b` to ensure that everything builds OK.
 +- [ ] Make a commit.
 +- [ ] Run `ninja dist`.
 +- [ ] Copy `jasmine-gjs-<VERSION>.tar.xz` to `../jasmine-gjs_<VERSION>.orig.tar.xz`.
 +- [ ] Extract the tarball.
 +- [ ] Enter the directory and run `debuild -uc -us -S` to build a source package.
 +
- - [ ] On [OBS](https://build.opensuse.org/project/repositories/home:ptomato), check if repositories should be enabled for any new Fedora, Ubuntu, Debian, or OpenSUSE distribution releases.
- - [ ] Copy `jasmine-gjs-<VERSION>.tar.xz`, `jasmine-gjs.spec`, `jasmine-gjs_<VERSION>.orig.tar.xz`, `jasmine-gjs_<VERSION>-1.debian.tar.xz`, and `jasmine-gjs_<VERSION>-1.dsc` into an OBS checkout of the `home:ptomato/jasmine-gjs` project.
- - [ ] Remove the files in the OBS checkout that are from the previous version.
- - [ ] Run `osc addremove`.
- - [ ] Run `osc commit`.
- - [ ] Check that all builds passed.
- 
- ## Releasing: Other ##
- 
- - [ ] Add `jasmine-gjs-<VERSION>.tar.xz` to the `downloads` directory in the `ptomato/ptomato.github.com` repository.
- - [ ] Modify `opensource/jasmine/jasmine.md` to point to the newest version.
- - [ ] Make a commit.
- - [ ] Back in the `jasmine-gjs` repository, run `git tag <VERSION>`; version is just dotted numbers, e.g. `2.2.1`, no `v` or `Version`.
++## Releasing ##
 +
++- [ ] Run `git tag <VERSION>`; version is just dotted numbers, e.g. `2.2.1`, no `v` or `Version`.
 +- [ ] Push the tag to GitHub.
 +- [ ] Copy the release notes from `NEWS.md` into https://github.com/ptomato/jasmine-gjs/releases
 +- [ ] Attach the tarball and the sha256sum from the `meson-dist` directory to the release notes.
++- [ ] Attach the RPM packages from `/path/to/rpmbuild/RPMS/` and `/path/to/rpmbuild/SRPMS` to the release notes.
++- [ ] Attach the Debian packages (`jasmine-gjs_<VERSION>-1_all.deb`, `jasmine-gjs_<VERSION>.orig.tar.xz`, `jasmine-gjs_<VERSION>-1.debian.tar.xz`, and `jasmine-gjs_<VERSION>-1.dsc`) to the release notes.
index ac3db00732725b042a3317bc8dd6c66d1df1335e,0000000000000000000000000000000000000000..dfaa05830abd4ab3091e62b88dc2147953f6eb77
mode 100644,000000..100644
--- /dev/null
@@@ -1,254 -1,0 +1,262 @@@
-             const fdstream = new Gio.UnixOutputStream({
 +import Gio from 'gi://Gio';
 +import GObject from 'gi://GObject';
 +
 +import {indenter} from './utils.js';
 +
 +const YELLOW = '\x1b[33m';
 +const GREEN = '\x1b[32m';
 +const RED = '\x1b[31m';
 +const NORMAL = '\x1b[0m';
 +
++let GioUnix = null;
++try {
++    GioUnix = (await import('gi://GioUnix')).default;
++} catch (e) {}
++
 +function createNoopTimer() {
 +    return {
 +        start() {},
 +        elapsed() {
 +            return 0;
 +        },
 +    };
 +}
 +
 +export const ConsoleReporter = GObject.registerClass({
 +    Properties: {
 +        'show-colors': GObject.ParamSpec.boolean('show-colors', 'Show colors',
 +            'Whether to print color output',
 +            GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT_ONLY,
 +            true),
 +        'jasmine-core-path': GObject.ParamSpec.string('jasmine-core-path',
 +            'Jasmine core path',
 +            'Path to Jasmine core module for stack trace purposes',
 +            GObject.ParamFlags.READWRITE,
 +            '/nowhere'),
 +    },
 +
 +    Signals: {
 +        'started': {},
 +        'complete': {
 +            param_types: [GObject.TYPE_BOOLEAN],
 +        },
 +    },
 +}, class ConsoleReporter extends GObject.Object {
 +    _init(props = {}) {
 +        if (props.hasOwnProperty('print')) {
 +            this._print = props.print;
 +            delete props.print;
 +        }
 +
 +        this._timerFactory = createNoopTimer;
 +        if (props.hasOwnProperty('timerFactory')) {
 +            this._timerFactory = props.timerFactory;
 +            delete props.timerFactory;
 +        }
 +
 +        super._init(props);
 +
 +        // The main timer should return 0 if the run hasn't started yet
 +        this._timers = {
 +            'main': createNoopTimer(),
 +        };
 +
 +        this._failedSpecs = [];
 +        this._failedSuites = [];
 +        this._suiteLevel = 0;
 +        this._specCount = 0;
 +        this._passingCount = 0;
 +        this._failureCount = 0;
 +        this._pendingCount = 0;
 +    }
 +
 +    _color(str, color) {
 +        if (typeof color !== 'undefined')
 +            return this.show_colors ? color + str + NORMAL : str;
 +        return str;
 +    }
 +
 +    // default print function that prints to stdout (GJS' built-in print
 +    // functions, print() and printerr(), unfortunately append newlines to
 +    // everything)
 +    static getStdout() {
 +        if (!this._stdout) {
++            const UnixOutputStream = GioUnix
++                ? GioUnix.OutputStream
++                : Gio.UnixOutputStream;
 +            const FD_STDOUT = 1;
++            const fdstream = new UnixOutputStream({
 +                fd: FD_STDOUT,
 +                close_fd: false,
 +            });
 +            this._stdout = new Gio.DataOutputStream({
 +                base_stream: fdstream,
 +            });
 +        }
 +        return this._stdout;
 +    }
 +
 +    _print(str) {
 +        ConsoleReporter.getStdout().put_string(str, null);
 +    }
 +
 +    // Used to start a timer associated with a particular ID. Subclasses can use
 +    // this to time actions that the base class doesn't time if they wish.
 +    startTimer(id) {
 +        this._timers[id] = this._timerFactory(id);
 +        this._timers[id].start();
 +    }
 +
 +    // Used to get the elapsed time from a timer with the given ID. Subclasses
 +    // can use this to time actions not timed by the base class. The base class
 +    // uses timers with the following IDs:
 +    //   main - times the whole suite
 +    //   suite:foo - times the suite with ID "foo"
 +    //   spec:bar - times the spec with ID "bar"
 +    elapsedTime(id) {
 +        return this._timers[id].elapsed();
 +    }
 +
 +    // Called with an "info" object with the following property:
 +    //   totalSpecsDefined - number of specs to be run
 +    jasmineStarted() {
 +        this.emit('started');
 +        this.startTimer('main');
 +    }
 +
 +    jasmineDone() {
 +        this.elapsedTime('main');  // Stop the timer
 +        this.emit('complete', this._failureCount === 0);
 +    }
 +
 +    // Called with a "result" object with the following properties:
 +    //   id - a string unique to this suite
 +    //   description - the name of the suite passed to describe()
 +    //   fullName - the full name including the names of parent suites
 +    //   failedExpectations - a list of failures in this suite
 +    suiteStarted(result) {
 +        if (result.id)
 +            this.startTimer(`suite:${result.id}`);
 +        this._suiteLevel++;
 +    }
 +
 +    // Called with the same object as suiteStarted(), with an extra property:
 +    //   status - "disabled", "failed", or "finished"
 +    // Adds another extra property if the suite was started properly with ID:
 +    //   time - time taken to execute the suite, in milliseconds
 +    suiteDone(result) {
 +        this._suiteLevel--;
 +        if (result.failedExpectations && result.failedExpectations.length > 0) {
 +            this._failureCount++;
 +            this._failedSuites.push(result);
 +        }
 +        if (result.id)
 +            result.time = this.elapsedTime(`suite:${result.id}`);
 +    }
 +
 +    // Called with a "result" object with the following properties:
 +    //   id - a string unique to this spec
 +    //   description: the name of the spec passed to it()
 +    //   fullName - the full name concatenated with the suite's full name
 +    //   failedExpectations - a list of failures in this spec
 +    //   passedExpectations - a list of succeeded expectations in this spec
 +    specStarted(result) {
 +        if (result.id)
 +            this.startTimer(`spec:${result.id}`);
 +        this._specCount++;
 +    }
 +
 +    // Called with the same object as specStarted(), with an extra property:
 +    //   status - "disabled", "pending", "failed", or "passed"
 +    // Adds another extra property if the spec was started properly with ID:
 +    //   time - time taken to execute the spec, in milliseconds
 +    specDone(result) {
 +        if (result.status === 'passed') {
 +            this._passingCount++;
 +        } else if (result.status === 'pending') {
 +            this._pendingCount++;
 +        } else if (result.status === 'failed') {
 +            this._failureCount++;
 +            this._failedSpecs.push(result);
 +        }
 +        if (result.id)
 +            result.time = this.elapsedTime(`spec:${result.id}`);
 +    }
 +
 +    filterStack(stack) {
 +        return stack.split('\n').filter(stackLine => {
 +            return stackLine.indexOf(this.jasmine_core_path) === -1;
 +        }).join('\n');
 +    }
 +});
 +
 +// This reporter has very nearly the same behaviour to Jasmine's default console
 +// reporter.
 +export const DefaultReporter = GObject.registerClass(class DefaultReporter extends ConsoleReporter {
 +    jasmineStarted(info) {
 +        super.jasmineStarted(info);
 +        this._print('Started\n');
 +    }
 +
 +    jasmineDone() {
 +        this._print('\n\n');
 +        if (this._failedSpecs.length > 0)
 +            this._print('Failures:');
 +        this._failedSpecs.forEach(this._printSpecFailureDetails, this);
 +
 +        if (this._specCount > 0) {
 +            this._print('\n');
 +            this._print(`${this._specCount} spec${this._specCount === 1 ? '' : 's'}, ${this._failureCount} failed`);
 +
 +            if (this._pendingCount)
 +                this._print(`, ${this._pendingCount} pending`);
 +        } else {
 +            this._print('No specs found');
 +        }
 +
 +        this._print('\n');
 +        const seconds = Math.round(this.elapsedTime('main')) / 1000;
 +        this._print(`\nFinished in ${seconds} s\n`);
 +
 +        this._failedSuites.forEach(this._printSuiteFailureDetails, this);
 +
 +        super.jasmineDone();
 +    }
 +
 +    specDone(result) {
 +        super.specDone(result);
 +
 +        const colors = {
 +            passed: GREEN,
 +            pending: YELLOW,
 +            failed: RED,
 +            disabled: undefined,
 +        };
 +        const symbols = {
 +            passed: '.',
 +            pending: '*',
 +            failed: 'F',
 +            disabled: '',
 +        };
 +        this._print(this._color(symbols[result.status], colors[result.status]));
 +    }
 +
 +    _printSpecFailureDetails(result, index) {
 +        this._print(`\n${index + 1}) ${result.fullName}\n`);
 +        result.failedExpectations.forEach(failedExpectation => {
 +            const report = `Message:
 +${this._color(failedExpectation.message, RED)}
 +Stack:
 +${this.filterStack(failedExpectation.stack)}
 +`;
 +            this._print(indenter.indent(report, 2));
 +        });
 +    }
 +
 +    _printSuiteFailureDetails(result) {
 +        result.failedExpectations.forEach(failedExpectation => {
 +            this._print(this._color(`An error was thrown in an afterAll
 +AfterAll ${failedExpectation.message}`, RED));
 +        });
 +    }
 +});
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e2a79bc7b5b1ebd7c98da8fabb9f2e3200d938c5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,705 @@@
++// This suite is Jasmine's documentation suite, exercising all of Jasmine's
++// functionality to make sure that the GJS test runner has hooked everything up
++// correctly. It's taken from the following pages:
++//    https://github.com/jasmine/jasmine.github.io/blob/3.99-4.0/_tutorials/src/0_your_first_suite.js
++//
++// Note: the "long asynchronous specs" suite near the bottom takes 9 seconds to
++// run. It is marked pending by default. To run this suite anyway, define an
++// environment variable RUN_THOROUGH_TESTS=yes.
++
++import GLib from 'gi://GLib';
++
++/**
++ ## Suites: `describe` Your Tests
++ The [describe](/api/edge/global.html#describe) function is for grouping related specs, typically each test file has one at the top level.
++ The string parameter is for naming the collection of specs, and will be concatenated with specs to make a spec's full name.
++ This aids in finding specs in a large suite.
++ If you name them well, your specs read as full sentences in traditional [BDD](http://en.wikipedia.org/wiki/Behavior-driven_development) style.
++
++ ## Specs
++ Specs are defined by calling the global Jasmine function [it](/api/edge/global.html#it), which, like `describe` takes a string and a function.
++ The string is the title of the spec and the function is the spec, or test.
++ A spec contains one or more expectations that test the state of the code.
++ An expectation in Jasmine is an assertion that is either true or false.
++ A spec with all true expectations is a passing spec. A spec with one or more false expectations is a failing spec.
++ */
++describe("A suite", function() {
++  it("contains spec with an expectation", function() {
++    expect(true).toBe(true);
++  });
++});
++
++/**
++ ### It's Just Functions
++ Since `describe` and `it` blocks are functions, they can contain any executable code necessary to implement the test. JavaScript scoping rules apply, so variables declared in a `describe` are available to any `it` block inside the suite.
++ */
++describe("A suite is just a function", function() {
++  var a;
++
++  it("and so is a spec", function() {
++    a = true;
++
++    expect(a).toBe(true);
++  });
++});
++
++/**
++ ## Expectations
++ Expectations are built with the function `expect` which takes a value, called the actual.
++ It is chained with a Matcher function, which takes the expected value.
++ */
++describe("The 'toBe' matcher compares with ===", function() {
++  /**
++   ### Matchers
++   Each matcher implements a boolean comparison between the actual value and the expected value.
++   It is responsible for reporting to Jasmine if the expectation is true or false.
++   Jasmine will then pass or fail the spec.
++   */
++
++  it("and has a positive case", function() {
++    expect(true).toBe(true);
++  });
++
++  /**
++   Any matcher can evaluate to a negative assertion by chaining the call to `expect` with a `not` before calling the matcher.
++   */
++
++  it("and can have a negative case", function() {
++    expect(false).not.toBe(true);
++  });
++
++/**
++ Jasmine has a rich set of matchers included, you can find the full list in the [API docs](/api/edge/matchers.html)
++ There is also the ability to write [custom matchers](custom_matcher.html) for when a project's domain calls for specific assertions that are not included in Jasmine.
++ */
++});
++
++/**
++ ### Setup and Teardown
++ To help a test suite DRY up any duplicated setup and teardown code, Jasmine provides the global [beforeEach](/api/edge/global.html#beforeEach), [afterEach](/api/edge/global.html#afterEach), [beforeAll](/api/edge/global.html#beforeAll), and [afterAll](/api/edge/global.html#afterAll) functions.
++ */
++describe("A suite with some shared setup", function() {
++  var foo = 0;
++
++  // As the name implies, the `beforeEach` function is called once before each spec in the `describe` in which it is called
++  beforeEach(function() {
++    foo += 1;
++  });
++
++  // and the `afterEach` function is called once after each spec.
++  afterEach(function() {
++    foo = 0;
++  });
++
++  // The `beforeAll` function is called only once before all the specs in `describe` are run
++  beforeAll(function() {
++    foo = 1;
++  });
++
++  // and the `afterAll` function is called after all specs finish
++  afterAll(function() {
++    foo = 0;
++  });
++
++});
++
++/**
++ * `beforeAll` and `afterAll` can be used to speed up test suites with expensive setup and teardown.
++ *
++ * However, be careful using `beforeAll` and `afterAll`!
++ * Since they are not reset between specs, it is easy to accidentally leak state between your specs so that they erroneously pass or fail.
++ */
++
++
++/**
++### The `this` keyword
++Another way to share variables between a `beforeEach`, `it`, and `afterEach` is through the `this` keyword. Each spec's `beforeEach`/`it`/`afterEach` has the `this` as the same empty object that is set back to empty for the next spec's `beforeEach`/`it`/`afterEach`.
++*/
++describe("A spec", function() {
++  beforeEach(function() {
++    this.foo = 0;
++  });
++
++  it("can use the `this` to share state", function() {
++    expect(this.foo).toEqual(0);
++    this.bar = "test pollution?";
++  });
++
++  it("prevents test pollution by having an empty `this` created for the next spec", function() {
++    expect(this.foo).toEqual(0);
++    expect(this.bar).toBe(undefined);
++  });
++});
++
++
++/**
++ ### Manually failing a spec with `fail`
++ The `fail` function causes a spec to fail. It can take a failure message or an Error object as a parameter.
++ */
++
++describe("A spec using the fail function", function() {
++  var foo = function(x, callBack) {
++    if (x) {
++      callBack();
++    }
++  };
++
++  it("should not call the callBack", function() {
++    foo(false, function() {
++      fail("Callback has been called");
++    });
++  });
++});
++
++/**
++ ### Nesting `describe` Blocks
++ Calls to `describe` can be nested, with specs defined at any level. This allows a suite to be composed as a tree of functions. Before a spec is executed, Jasmine walks down the tree executing each `beforeEach` function in order. After the spec is executed, Jasmine walks through the `afterEach` functions similarly.
++ */
++describe("A spec", function() {
++  var foo;
++
++  beforeEach(function() {
++    foo = 0;
++    foo += 1;
++  });
++
++  afterEach(function() {
++    foo = 0;
++  });
++
++  it("is just a function, so it can contain any code", function() {
++    expect(foo).toEqual(1);
++  });
++
++  it("can have more than one expectation", function() {
++    expect(foo).toEqual(1);
++    expect(true).toEqual(true);
++  });
++
++  describe("nested inside a second describe", function() {
++    var bar;
++
++    beforeEach(function() {
++      bar = 1;
++    });
++
++    it("can reference both scopes as needed", function() {
++      expect(foo).toEqual(bar);
++    });
++  });
++});
++
++/**
++ ## Disabling Suites
++ Suites can be disabled with the `xdescribe` function. These suites and any specs inside them are skipped when run and thus their results will show as pending.
++ */
++xdescribe("A spec", function() {
++  var foo;
++
++  beforeEach(function() {
++    foo = 0;
++    foo += 1;
++  });
++
++  it("is just a function, so it can contain any code", function() {
++    expect(foo).toEqual(1);
++  });
++});
++
++/**
++ ## Pending Specs
++ Pending specs do not run, but their names will show up in the results as `pending`.
++ */
++
++describe("Pending specs", function() {
++
++  /** Any spec declared with `xit` is marked as pending.
++   */
++  xit("can be declared 'xit'", function() {
++    expect(true).toBe(false);
++  });
++
++  /** Any spec declared without a function body will also be marked pending in results.
++   */
++
++  it("can be declared with 'it' but without a function");
++
++  /** And if you call the function `pending` anywhere in the spec body, no matter the expectations, the spec will be marked pending.
++   * A string passed to `pending` will be treated as a reason and displayed when the suite finishes.
++   */
++  it("can be declared by calling 'pending' in the spec body", function() {
++    expect(true).toBe(false);
++    pending('this is why it is pending');
++  });
++});
++
++/**
++ ## Spies
++ Jasmine has test double functions called [spies](/api/edge/Spy.html).
++ A spy can stub any function and tracks calls to it and all arguments.
++ A spy only exists in the `describe` or `it` block in which it is defined, and will be removed after each spec.
++ There are special matchers for interacting with spies.
++ */
++
++describe("A spy", function() {
++  var foo, bar = null;
++
++  beforeEach(function() {
++    foo = {
++      setBar: function(value) {
++        bar = value;
++      }
++    };
++
++    // You can define what the spy will do when invoked with [and](/api/edge/Spy_and.html).
++    spyOn(foo, 'setBar');
++
++    foo.setBar(123);
++    foo.setBar(456, 'another param');
++  });
++
++  // The `toHaveBeenCalled` matcher will pass if the spy was called.
++  it("tracks that the spy was called", function() {
++    expect(foo.setBar).toHaveBeenCalled();
++  });
++
++  // The `toHaveBeenCalledTimes` matcher will pass if the spy was called the specified number of times.
++  it("tracks that the spy was called x times", function() {
++    expect(foo.setBar).toHaveBeenCalledTimes(2);
++  });
++
++  // The `toHaveBeenCalledWith` matcher will return true if the argument list matches any of the recorded calls to the spy.
++  it("tracks all the arguments of its calls", function() {
++    expect(foo.setBar).toHaveBeenCalledWith(123);
++    expect(foo.setBar).toHaveBeenCalledWith(456, 'another param');
++  });
++
++  it("stops all execution on a function", function() {
++    expect(bar).toBeNull();
++  });
++
++  // You get all of the data that a spy tracks about its calls with [calls](/api/edge/Spy_calls.html)
++  it("tracks if it was called at all", function() {
++    foo.setBar();
++
++    expect(foo.setBar.calls.any()).toEqual(true);
++  });
++});
++
++/**
++ ### Spies: `createSpy`
++ When there is not a function to spy on, [jasmine.createSpy](/api/edge/jasmine.html#.createSpy) can create a "bare" spy.
++ This spy acts as any other spy - tracking calls, arguments, etc. But there is no implementation behind it.
++ */
++describe("A spy, when created manually", function() {
++  var whatAmI;
++
++  beforeEach(function() {
++    whatAmI = jasmine.createSpy('whatAmI');
++
++    whatAmI("I", "am", "a", "spy");
++  });
++
++  it("tracks that the spy was called", function() {
++    expect(whatAmI).toHaveBeenCalled();
++  });
++});
++
++/**
++ ### Spies: `createSpyObj`
++ In order to create a mock with multiple spies, use [jasmine.createSpyObj](/api/edge/jasmine.html#.createSpyObj) and pass an array of strings.
++ It returns an object that has a property for each string that is a spy.
++ */
++describe("Multiple spies, when created manually", function() {
++  var tape;
++
++  beforeEach(function() {
++    tape = jasmine.createSpyObj('tape', ['play', 'pause', 'stop', 'rewind']);
++
++    tape.play();
++    tape.pause();
++    tape.rewind(0);
++  });
++
++  it("creates spies for each requested function", function() {
++    expect(tape.play).toBeDefined();
++    expect(tape.pause).toBeDefined();
++    expect(tape.stop).toBeDefined();
++    expect(tape.rewind).toBeDefined();
++  });
++});
++
++/**
++ * ## Matching with more finesse
++ *
++ * Sometimes you don't want to match with exact equality.
++ * Jasmine provides a number of asymmetric equality testers.
++ */
++describe("Matching with finesse", function() {
++
++  /**
++   * [jasmine.any](/api/edge/jasmine.html#.any) takes a constructor or "class" name as an expected value.
++   * It returns `true` if the constructor matches the constructor of the actual value.
++   */
++  describe("jasmine.any", function() {
++    it("matches any value", function() {
++      expect({}).toEqual(jasmine.any(Object));
++      expect(12).toEqual(jasmine.any(Number));
++    });
++
++    describe("when used with a spy", function() {
++      it("is useful for comparing arguments", function() {
++        var foo = jasmine.createSpy('foo');
++        foo(12, function() {
++          return true;
++        });
++
++        expect(foo).toHaveBeenCalledWith(jasmine.any(Number), jasmine.any(Function));
++      });
++    });
++  });
++
++  /**
++   [jasmine.anything](/api/edge/global.html#.anything) returns `true` if the actual value is not `null` or `undefined`.
++   */
++  describe("jasmine.anything", function() {
++    it("matches anything", function() {
++      expect(1).toEqual(jasmine.anything());
++    });
++
++    describe("when used with a spy", function() {
++      it("is useful when the argument can be ignored", function() {
++        var foo = jasmine.createSpy('foo');
++        foo(12, function() {
++          return false;
++        });
++
++        expect(foo).toHaveBeenCalledWith(12, jasmine.anything());
++      });
++    });
++  });
++
++  /**
++   [jasmine.objectContaining](/api/edge/global.html#.objectContaining) is for those times when an expectation only cares about certain key/value pairs in the actual.
++   */
++  describe("jasmine.objectContaining", function() {
++    var foo;
++
++    beforeEach(function() {
++      foo = {
++        a: 1,
++        b: 2,
++        bar: "baz"
++      };
++    });
++
++    it("matches objects with the expect key/value pairs", function() {
++      expect(foo).toEqual(jasmine.objectContaining({
++        bar: "baz"
++      }));
++      expect(foo).not.toEqual(jasmine.objectContaining({
++        c: 37
++      }));
++    });
++
++    describe("when used with a spy", function() {
++      it("is useful for comparing arguments", function() {
++        var callback = jasmine.createSpy('callback');
++
++        callback({
++          bar: "baz"
++        });
++
++        expect(callback).toHaveBeenCalledWith(jasmine.objectContaining({
++          bar: "baz"
++        }));
++      });
++    });
++  });
++
++  /**
++   [jasmine.arrayContaining](/api/edge/global.html#.arrayContaining) is for those times when an expectation only cares about some of the values in an array.
++   */
++  describe("jasmine.arrayContaining", function() {
++    var foo;
++
++    beforeEach(function() {
++      foo = [1, 2, 3, 4];
++    });
++
++    it("matches arrays with some of the values", function() {
++      expect(foo).toEqual(jasmine.arrayContaining([3, 1]));
++      expect(foo).not.toEqual(jasmine.arrayContaining([6]));
++    });
++
++    describe("when used with a spy", function() {
++      it("is useful when comparing arguments", function() {
++        var callback = jasmine.createSpy('callback');
++
++        callback([1, 2, 3, 4]);
++
++        expect(callback).toHaveBeenCalledWith(jasmine.arrayContaining([4, 2, 3]));
++        expect(callback).not.toHaveBeenCalledWith(jasmine.arrayContaining([5, 2]));
++      });
++    });
++  });
++
++  /**
++   [jasmine.stringMatching](/api/edge/global.html#.stringMatching) is for when you don't want to match a string in a larger object exactly, or match a portion of a string in a spy expectation.
++   */
++  describe('jasmine.stringMatching', function() {
++    it("matches as a regexp", function() {
++      expect({foo: 'bar'}).toEqual({foo: jasmine.stringMatching(/^bar$/)});
++      expect({foo: 'foobarbaz'}).toEqual({foo: jasmine.stringMatching('bar')});
++    });
++
++    describe("when used with a spy", function() {
++      it("is useful for comparing arguments", function() {
++        var callback = jasmine.createSpy('callback');
++
++        callback('foobarbaz');
++
++        expect(callback).toHaveBeenCalledWith(jasmine.stringMatching('bar'));
++        expect(callback).not.toHaveBeenCalledWith(jasmine.stringMatching(/^bar$/));
++      });
++    });
++  });
++
++  /**
++   ### Custom asymmetric equality tester
++   When you need to check that something meets a certain criteria, without being strictly equal, you can also specify a custom asymmetric equality tester simply by providing an object that has an `asymmetricMatch` function.
++   */
++  describe("custom asymmetry", function() {
++    var tester = {
++      asymmetricMatch: function(actual) {
++        var secondValue = actual.split(',')[1];
++        return secondValue === 'bar';
++      }
++    };
++
++    it("dives in deep", function() {
++      expect("foo,bar,baz,quux").toEqual(tester);
++    });
++
++    describe("when used with a spy", function() {
++      it("is useful for comparing arguments", function() {
++        var callback = jasmine.createSpy('callback');
++
++        callback('foo,bar,baz');
++
++        expect(callback).toHaveBeenCalledWith(tester);
++      });
++    });
++  });
++});
++
++
++/**
++ ## Jasmine Clock
++ The [Jasmine Clock](/api/edge/Clock.html) is available for testing time dependent code.
++ */
++describe("Manually ticking the Jasmine Clock", function() {
++  var timerCallback;
++
++  /**
++   It is installed with a call to `jasmine.clock().install` in a spec or suite that needs to manipulate time.
++   */
++  beforeEach(function() {
++    timerCallback = jasmine.createSpy("timerCallback");
++    jasmine.clock().install();
++  });
++
++  /**
++   Be sure to uninstall the clock after you are done to restore the original functions.
++   */
++  afterEach(function() {
++    jasmine.clock().uninstall();
++  });
++
++  /**
++   ### Mocking the JavaScript Timeout Functions
++   You can make `setTimeout` or `setInterval` synchronous executing the registered functions only once the clock is ticked forward in time.
++
++   To execute registered functions, move time forward via the `jasmine.clock().tick` function, which takes a number of milliseconds.
++   */
++  it("causes a timeout to be called synchronously", function() {
++    setTimeout(function() {
++      timerCallback();
++    }, 100);
++
++    expect(timerCallback).not.toHaveBeenCalled();
++
++    jasmine.clock().tick(101);
++
++    expect(timerCallback).toHaveBeenCalled();
++  });
++
++  it("causes an interval to be called synchronously", function() {
++    setInterval(function() {
++      timerCallback();
++    }, 100);
++
++    expect(timerCallback).not.toHaveBeenCalled();
++
++    jasmine.clock().tick(101);
++    expect(timerCallback.calls.count()).toEqual(1);
++
++    jasmine.clock().tick(50);
++    expect(timerCallback.calls.count()).toEqual(1);
++
++    jasmine.clock().tick(50);
++    expect(timerCallback.calls.count()).toEqual(2);
++  });
++
++  /**
++   ### Mocking the Date
++   The Jasmine Clock can also be used to mock the current date.
++  */
++  describe("Mocking the Date object", function(){
++    it("mocks the Date object and sets it to a given time", function() {
++      var baseTime = new Date(2013, 9, 23);
++      // If you do not provide a base time to `mockDate` it will use the current date.
++      jasmine.clock().mockDate(baseTime);
++
++      jasmine.clock().tick(50);
++      expect(new Date().getTime()).toEqual(baseTime.getTime() + 50);
++    });
++  });
++});
++
++
++/**
++ ## Asynchronous Support
++ Jasmine also has support for running specs that require testing asynchronous operations. The functions that you pass to `beforeAll`, `afterAll`, `beforeEach`, `afterEach`, and `it` can be asynchronous. There are three different ways to indicate that a function is asynchronous: by taking an optional callback parameter, by returning a promise, or by using the `async` keyword in environments that support it.
++ */
++describe("Asynchronous specs", function() {
++  var value;
++
++  /**
++   ### Using callbacks
++   */
++  describe("Using callbacks", function() {
++    /**
++     Calls to `beforeAll`, `afterAll`, `beforeEach`, `afterEach`, and `it` can take an optional single argument that should be called when the async work is complete.
++     */
++    beforeEach(function(done) {
++      setTimeout(function() {
++        value = 0;
++        done();
++      }, 1);
++    });
++
++    /**
++     This spec will not start until the `done` function is called in the call to `beforeEach` above. And this spec will not complete until its `done` is called.
++     */
++
++    it("should support async execution of test preparation and expectations", function(done) {
++      value++;
++      expect(value).toBeGreaterThan(0);
++      done();
++    });
++
++    /**
++     The `done.fail` function fails the spec and indicates that it has completed.
++     */
++    describe("A spec using done.fail", function() {
++      var foo = function(x, callBack1, callBack2) {
++        if (x) {
++          setTimeout(callBack1, 0);
++        } else {
++          setTimeout(callBack2, 0);
++        }
++      };
++
++      it("should not call the second callBack", function(done) {
++        foo(true,
++          done,
++          function() {
++            done.fail("Second callback has been called");
++          }
++        );
++      });
++    });
++  });
++
++  /**
++   ### Using promises
++   */
++  describe("Using promises", function() {
++    /**
++     Functions passed to `beforeAll`, `afterAll`, `beforeEach`, `afterEach`, and `it` can return a promise that should be resolved when the async work is complete. If the promise is rejected, all specs in the enclosing `describe` will fail.
++     */
++    beforeEach(function() {
++      return soon().then(function() {
++        value = 0;
++      });
++    });
++
++    /**
++     This spec will not start until the promise returned from the call to `beforeEach` above is settled. And this spec will not complete until the promise that it returns is settled. If the promise is rejected, the spec will fail.
++     */
++    it("should support async execution of test preparation and expectations", function() {
++      return soon().then(function() {
++        value++;
++        expect(value).toBeGreaterThan(0);
++      });
++    });
++  });
++
++  /**
++   ### Using async/await
++   */
++  describe("Using async/await", function() {
++    /**
++     Functions passed to `beforeAll`, `afterAll`, `beforeEach`, `afterEach`, and `it` can be declared `async` in environments that support `async`/`await`.
++     */
++    beforeEach(async function() {
++      await soon();
++      value = 0;
++    });
++
++    /**
++     This spec will not start until the promise returned from the call to `beforeEach` above is settled. And this spec will not complete until the promise that it returns is settled.
++     */
++    it("should support async execution of test preparation and expectations", async function() {
++      await soon();
++      value++;
++      expect(value).toBeGreaterThan(0);
++    });
++  });
++
++
++  /**
++   By default jasmine will wait for 5 seconds for an asynchronous spec to finish before causing a timeout failure.
++   If the timeout expires before `done` is called, the current spec will be marked as failed and suite execution will continue as if `done` was called.
++
++   If specific specs should fail faster or need more time this can be adjusted by passing a timeout value to `it`, etc.
++
++   If the entire suite should have a different timeout, `jasmine.DEFAULT_TIMEOUT_INTERVAL` can be set globally, outside of any given `describe`.
++   */
++  describe("long asynchronous specs", function() {
++    beforeEach(function(done) {
++      done();
++    }, 1000);
++
++    if (GLib.getenv('RUN_THOROUGH_TESTS') === 'yes') {
++      it("takes a long time", function(done) {
++        setTimeout(function() {
++          done();
++        }, 9000);
++      }, 10000);
++    }
++
++    afterEach(function(done) {
++      done();
++    }, 1000);
++  });
++
++  function soon() {
++    return new Promise(function(resolve, reject) {
++      setTimeout(function() {
++        resolve();
++      }, 1);
++    });
++  }
++});
index 3456d7d30125eab0c64dc6e44f6b73e0648e3163,0000000000000000000000000000000000000000..3f674beddfd32ab369cfa6b0fc6242656e863152
mode 100644,000000..100644
--- /dev/null
@@@ -1,124 -1,0 +1,125 @@@
 +import Gio from 'gi://Gio';
 +import GLib from 'gi://GLib';
 +
 +import * as Command from '../src/command.js';
 +import * as JUnitReporter from '../src/junitReporter.js';
 +import * as TapReporter from '../src/tapReporter.js';
 +import * as VerboseReporter from '../src/verboseReporter.js';
 +
 +const {mainloop} = Command;
 +
 +describe('Jasmine command', function () {
 +    let fakeJasmine;
 +
 +    beforeAll(function () {
 +        Gio._promisify(Gio._LocalFilePrototype, 'delete_async', 'delete_finish');
 +    });
 +
 +    beforeEach(function () {
 +        fakeJasmine = jasmine.createSpyObj('jasmine', ['addReporter', 'configureDefaultReporter', 'execute']);
++        fakeJasmine.execute.and.resolveTo();
 +        spyOn(mainloop, 'runAsync');  // stub out system behaviour
 +    });
 +
 +    describe('running specs', function () {
 +        it('shows colors by default', function () {
 +            Command.run(fakeJasmine, []);
 +            expect(fakeJasmine.addReporter)
 +                .toHaveBeenCalledWith(jasmine.objectContaining({show_colors: true}));
 +        });
 +
 +        it('allows colors to be turned off', function () {
 +            Command.run(fakeJasmine, ['--no-color']);
 +            expect(fakeJasmine.addReporter)
 +                .toHaveBeenCalledWith(jasmine.objectContaining({show_colors: false}));
 +        });
 +
 +        it('lets later color arguments override earlier ones', function () {
 +            Command.run(fakeJasmine, ['--color', '--no-color']);
 +            expect(fakeJasmine.addReporter)
 +                .toHaveBeenCalledWith(jasmine.objectContaining({show_colors: false}));
 +            Command.run(fakeJasmine, ['--no-color', '--color']);
 +            expect(fakeJasmine.addReporter)
 +                .toHaveBeenCalledWith(jasmine.objectContaining({show_colors: true}));
 +        });
 +
 +        it('loads the verbose reporter', function () {
 +            Command.run(fakeJasmine, ['--verbose']);
 +            expect(fakeJasmine.addReporter).toHaveBeenCalled();
 +            const [reporter] = fakeJasmine.addReporter.calls.argsFor(0);
 +            expect(reporter.constructor).toBe(VerboseReporter.VerboseReporter);
 +        });
 +
 +        it('loads the TAP reporter', function () {
 +            Command.run(fakeJasmine, ['--tap']);
 +            expect(fakeJasmine.addReporter).toHaveBeenCalled();
 +            const [reporter] = fakeJasmine.addReporter.calls.argsFor(0);
 +            expect(reporter.constructor).toBe(TapReporter.TapReporter);
 +        });
 +
 +        it('loads the JUnit reporter alongside the usual reporter', function () {
 +            // Unfortunately /dev/null can't be opened as a GFile, so we need to
 +            // write to a temporary file.
 +            const [tmpFile, stream] = Gio.File.new_tmp('junitreportXXXXXX');
 +            const tmpPath = tmpFile.get_path();
 +            stream.close(null);
 +
 +            Command.run(fakeJasmine, ['--junit', tmpPath]);
 +            expect(fakeJasmine.addReporter.calls.count()).toBe(2);
 +            const reporters = fakeJasmine.addReporter.calls.allArgs().map(args => args[0].constructor);
 +            expect(reporters).toContain(JUnitReporter.JUnitReporter);
 +
 +            tmpFile.delete_async(GLib.PRIORITY_DEFAULT, null).then(() => {});
 +        });
 +
 +        it('creates a directory for the report if necessary', function () {
 +            const tmpDir = GLib.dir_make_tmp('junitreportXXXXXX');
 +            const tmpFile =
 +                Gio.File.new_for_path(tmpDir).get_child('dir').get_child('report.xml');
 +            const tmpPath = tmpFile.get_path();
 +
 +            Command.run(fakeJasmine, ['--junit', tmpPath]);
 +            expect(tmpFile.query_exists(null)).toBeTruthy();
 +
 +            tmpFile.delete_async(GLib.PRIORITY_DEFAULT, null)
 +                .then(() => tmpFile.get_parent().delete_async(GLib.PRIORITY_DEFAULT, null))
 +                .then(() => tmpFile.get_parent().get_parent().delete_async(GLib.PRIORITY_DEFAULT, null));
 +        });
 +
 +        it('uses the value of JASMINE_JUNIT_REPORTS_DIR', function () {
 +            const oldPath = GLib.getenv('JASMINE_JUNIT_REPORTS_DIR');
 +            const tmpDir = GLib.dir_make_tmp('junitreportXXXXXX');
 +            GLib.setenv('JASMINE_JUNIT_REPORTS_DIR', tmpDir, true);
 +
 +            Command.run(fakeJasmine, ['--junit', 'report.xml']);
 +            const reportFile =
 +                Gio.File.new_for_path(tmpDir).get_child('report.xml');
 +            expect(reportFile.query_exists(null)).toBeTruthy();
 +
 +            reportFile.delete_async(GLib.PRIORITY_DEFAULT, null)
 +                .then(() => reportFile.get_parent().delete_async(GLib.PRIORITY_DEFAULT, null));
 +
 +            if (oldPath !== null)
 +                GLib.setenv('JASMINE_JUNIT_REPORTS_DIR', oldPath, true);
 +            else
 +                GLib.unsetenv('JASMINE_JUNIT_REPORTS_DIR');
 +        });
 +
 +        it('executes the Jasmine suite', function (done) {
 +            expectAsync(Command.run(fakeJasmine, [])).toBeResolvedTo(0);
 +            // fakeJasmine.execute() is started in idle
 +            GLib.idle_add(GLib.PRIORITY_DEFAULT, function () {
 +                expect(fakeJasmine.execute).toHaveBeenCalled();
 +                done();
 +            });
 +        });
 +
 +        it('runs the specified specs', function (done) {
 +            Command.run(fakeJasmine, ['spec/some/fileSpec.js', '--no-color']);
 +            GLib.idle_add(GLib.PRIORITY_DEFAULT, function () {
 +                expect(fakeJasmine.execute).toHaveBeenCalledWith(['spec/some/fileSpec.js']);
 +                done();
 +            });
 +        });
 +    });
 +});
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..067eabfdaab66d5a48e2840eec9f51f251915f41
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,127 @@@
++/**
++ *
++ * Often a project will want to encapsulate custom matching code for use across multiple specs. Here is how to create a Jasmine-compatible custom matcher.
++ *
++ * A custom matcher at its root is a comparison function that takes an `actual` value and `expected` value. This factory is passed to Jasmine, ideally in a call to `beforeEach` and will be in scope and available for all of the specs inside a given call to `describe`. Custom matchers are torn down between specs. The name of the factory will be the name of the matcher exposed on the return value of the call to `expect`.
++ *
++ */
++
++/**
++ * This object has a custom matcher named "toBeGoofy".
++ */
++var customMatchers = {
++
++  /**
++   * ## Matcher Factories
++   *
++   * Custom matcher factories are passed a `matchersUtil` parameter, which has a set
++   * of utility functions for matchers to use to perform tasks like determining
++   * whether two objects are equal
++   * (see: [`MatchersUtil`][MatchersUtil] for reference documentation). By using
++   * `MatchersUtil` where appropriate, custom matchers can work with
++   * [custom equality testers][CustomEqualityTesters] and
++   * [custom object formatters][CustomObjectFormatters] without any extra effort.
++   *
++   * A second `customEqualityTesters` parameter is passed for compatibility with
++   * Jasmine 3.5 and earlier. Matchers written for Jasmine 3.6 and later should
++   * ignore it. It will no longer be provided in Jasmine 4.
++   *
++   * [MatchersUtil]: /api/edge/MatchersUtil.html
++   * [CustomEqualityTesters]: /tutorials/custom_equality
++   * [CustomObjectFormatters]: /tutorials/custom_object_formatters
++   */
++  toBeGoofy: function(matchersUtil) {
++    /**
++     * The factory method should return an object with a `compare` function that will be called to check the expectation.
++     */
++    return {
++      /**
++       * ## A Function to `compare`
++       *
++       * The compare function receives the value passed to `expect()` as the first argument - the actual - and the value (if any) passed to the matcher itself as second argument.
++       */
++      compare: function(actual, expected) {
++
++        /**
++         * `toBeGoofy` takes an optional `expected` argument, so define it here if not passed in.
++         */
++        if (expected === undefined) {
++          expected = '';
++        }
++
++        /**
++         * ### Result
++         *
++         * The `compare` function must return a result object with a `pass` property that is a boolean result of the matcher. The `pass` property tells the expectation whether the matcher was successful (`true`) or unsuccessful (`false`). If the expectation is called/chained with `.not`, the expectation will negate this to determine whether the expectation is met.
++         */
++        var result = {};
++
++        /**
++         * `toBeGoofy` tests for equality of the actual's `hyuk` property to see if it matches the expectation.
++         */
++        result.pass = matchersUtil.equals(actual.hyuk, "gawrsh" + expected);
++
++        /**
++         * ### Failure Messages
++         *
++         * If left `undefined`, the expectation will attempt to craft a failure message for the matcher. However, if the return value has a `message` property it will be used for a  failed expectation.
++         */
++        if (result.pass) {
++          /**
++           * The matcher succeeded, so the custom failure message should be present in the case of a negative expectation - when the expectation is used with `.not`.
++           */
++          result.message = "Expected " + actual + " not to be quite so goofy";
++        } else {
++          /**
++           * The matcher failed, so the custom failure message should be present in the case of a positive expectation
++           */
++          result.message = "Expected " + actual + " to be goofy, but it was not very goofy";
++        }
++
++        /**
++         * Return the result of the comparison.
++         */
++        return result;
++      }
++    };
++  }
++};
++
++/**
++* ### Custom negative comparators
++*
++* If you need more control over the negative comparison (the `not` case) than the simple boolean inversion above, you can also have your matcher factory include another key, `negativeCompare` alongside `compare`, for which the value is a function to invoke when `.not` is used. This function/key is optional.
++*/
++
++/**
++ * ## Registration and Usage
++ */
++describe("Custom matcher: 'toBeGoofy'", function() {
++  /**
++   * Register the custom matchers with Jasmine. All properties on the object passed in will be available as custom matchers (e.g., in this case `toBeGoofy`).
++   */
++  beforeEach(function() {
++    jasmine.addMatchers(customMatchers);
++  });
++
++  /**
++   * Once a custom matcher is registered with Jasmine, it is available on any expectation.
++   */
++  it("is available on an expectation", function() {
++    expect({
++      hyuk: 'gawrsh'
++    }).toBeGoofy();
++  });
++
++  it("can take an 'expected' parameter", function() {
++    expect({
++      hyuk: 'gawrsh is fun'
++    }).toBeGoofy(' is fun');
++  });
++
++  it("can be negated", function() {
++    expect({
++      hyuk: 'this is fun'
++    }).not.toBeGoofy();
++  });
++});
index fd7de3c76f58bae8567e5c82b895a5b3f590e3df,0000000000000000000000000000000000000000..141b6b66c640ff0c416f75d031bca43dd04d79e7
mode 100644,000000..100644
--- /dev/null
@@@ -1,191 -1,0 +1,191 @@@
-         expect(() => testJasmine.loadSpecs()).not.toThrow();
 +import Gio from 'gi://Gio';
 +import GLib from 'gi://GLib';
 +
 +import * as JasmineBoot from '../src/jasmineBoot.js';
 +
 +const [testFile] = GLib.filename_from_uri(import.meta.url);
 +const testDir = GLib.path_get_dirname(testFile);
 +
 +const customMatchers = {
 +    toMatchAllFiles() {
 +        return {
 +            compare(actual, expected) {
 +                const result = {
 +                    message: `Expected ${JSON.stringify(actual)} `,
 +                };
 +                if (actual.length !== expected.length) {
 +                    result.pass = false;
 +                    result.message += `to match ${expected.length} ${
 +                        expected.length === 1 ? 'file' : 'files'
 +                    }, but it contained ${actual.length}`;
 +                    return result;
 +                }
 +
 +                let unexpectedFile;
 +                result.pass = actual.every(path => {
 +                    const actualFile = Gio.File.new_for_path(path);
 +                    const retval = expected.some(expectedPath => {
 +                        const expectedFile = Gio.File.new_for_path(expectedPath);
 +                        return actualFile.equal(expectedFile);
 +                    });
 +                    if (!retval)
 +                        unexpectedFile = path;
 +                    return retval;
 +                });
 +                if (result.pass) {
 +                    result.message += `not to match a list of files ${
 +                        expected}, but it did.`;
 +                } else if (unexpectedFile) {
 +                    result.message += `to match a list of files ${expected
 +                    }, but it contained ${unexpectedFile}`;
 +                } else {
 +                    result.message += `to match the list of files ${expected
 +                    }, but it did not: ${actual}`;
 +                }
 +                return result;
 +            },
 +        };
 +    },
 +};
 +
 +describe('Jasmine boot', function () {
 +    let testJasmine;
 +
 +    beforeEach(function () {
 +        const bootedJasmine = {
 +            getEnv: jasmine.createSpy('getEnv').and.returnValue({
 +                addReporter: jasmine.createSpy('addReporter'),
 +                execute: jasmine.createSpy('execute'),
 +                configure: jasmine.createSpy('configure'),
 +            }),
 +            Timer: jasmine.createSpy('Timer'),
 +            Expectation: {
 +                addMatchers: jasmine.createSpy('addMatchers'),
 +            },
 +        };
 +
 +        const fakeJasmineRequireObj = {
 +            core: jasmine.createSpy('core').and.returnValue(bootedJasmine),
 +            interface: jasmine.createSpy('interface'),
 +        };
 +
 +        const fakeJasmineCore = {
 +            getJasmineRequireObj() {
 +                return fakeJasmineRequireObj;
 +            },
 +            __file__: 'fake/jasmine/path/jasmine.js',
 +        };
 +
 +        testJasmine = new JasmineBoot.Jasmine({jasmineCore: fakeJasmineCore});
 +
 +        jasmine.addMatchers(customMatchers);
 +    });
 +
 +    it('adds a nonexistent spec file', function () {
 +        expect(testJasmine.specFiles).toEqual([]);
 +        testJasmine.addSpecFiles([`${testDir}/non/existent/file.js`]);
 +        expect(testJasmine.specFiles).toMatchAllFiles([
 +            `${testDir}/non/existent/file.js`,
 +        ]);
 +    });
 +
 +    it('adds a real spec file', function () {
 +        expect(testJasmine.specFiles).toEqual([]);
 +        testJasmine.addSpecFiles([`${testDir}/fixtures/someSpec.js`]);
 +        expect(testJasmine.specFiles).toMatchAllFiles([
 +            `${testDir}/fixtures/someSpec.js`,
 +        ]);
 +    });
 +
 +    it('adds more than one spec file', function () {
 +        expect(testJasmine.specFiles).toEqual([]);
 +        testJasmine.addSpecFiles([
 +            `${testDir}/fixtures/someSpec.js`,
 +            `${testDir}/fixtures/otherSpec.js`,
 +        ]);
 +        expect(testJasmine.specFiles).toMatchAllFiles([
 +            `${testDir}/fixtures/someSpec.js`,
 +            `${testDir}/fixtures/otherSpec.js`,
 +        ]);
 +    });
 +
 +    it('adds a whole directory of spec files', function () {
 +        expect(testJasmine.specFiles).toEqual([]);
 +        testJasmine.addSpecFiles([`${testDir}/fixtures`]);
 +        expect(testJasmine.specFiles).toMatchAllFiles([
 +            `${testDir}/fixtures/include/module.js`,
 +            `${testDir}/fixtures/include/spec.js`,
 +            `${testDir}/fixtures/otherSpec.js`,
 +            `${testDir}/fixtures/path1/test.js`,
 +            `${testDir}/fixtures/path2/test.js`,
 +            `${testDir}/fixtures/someSpec.js`,
 +            `${testDir}/fixtures/syntaxErrorSpec.js`,
 +        ]);
 +        expect(testJasmine.specFiles.every(path => path.indexOf('notASpec.txt') === -1)).toBe(true);
 +    });
 +
 +    it('adds spec files in different directories with the same name', function () {
 +        testJasmine.addSpecFiles([
 +            `${testDir}/fixtures/path1`,
 +            `${testDir}/fixtures/path2`,
 +        ]);
 +        expect(testJasmine.specFiles).toMatchAllFiles([
 +            `${testDir}/fixtures/path1/test.js`,
 +            `${testDir}/fixtures/path2/test.js`,
 +        ]);
 +    });
 +
 +    it('respects excluded files', function () {
 +        testJasmine.exclusions = ['otherSpec.js', 'syntaxErrorSpec.js'];
 +        testJasmine.addSpecFiles([`${testDir}/fixtures`]);
 +        expect(testJasmine.specFiles).toMatchAllFiles([
 +            `${testDir}/fixtures/include/module.js`,
 +            `${testDir}/fixtures/include/spec.js`,
 +            `${testDir}/fixtures/someSpec.js`,
 +            `${testDir}/fixtures/path1/test.js`,
 +            `${testDir}/fixtures/path2/test.js`,
 +        ]);
 +    });
 +
 +    it('matches at the end of the containing path', function () {
 +        testJasmine.exclusions = ['test/fixtures'];
 +        testJasmine.addSpecFiles([`${testDir}/fixtures`]);
 +        expect(testJasmine.specFiles).toMatchAllFiles([
 +            `${testDir}/fixtures/include/module.js`,
 +            `${testDir}/fixtures/include/spec.js`,
 +            `${testDir}/fixtures/path1/test.js`,
 +            `${testDir}/fixtures/path2/test.js`,
 +        ]);
 +    });
 +
 +    it('can handle globs in excluded files', function () {
 +        testJasmine.exclusions = ['*.js'];
 +        testJasmine.addSpecFiles([`${testDir}/fixtures`]);
 +        expect(testJasmine.specFiles).toMatchAllFiles([]);
 +    });
 +
 +    it('adds the Jasmine path when adding a reporter', function () {
 +        const fakeReporter = {};
 +        testJasmine.addReporter(fakeReporter);
 +        expect(fakeReporter.jasmine_core_path).toMatch('fake/jasmine/path');
 +    });
 +
 +    it('imports spec files in different directories with the same name', function () {
 +        testJasmine.addSpecFiles([
 +            `${testDir}/fixtures/path1`,
 +            `${testDir}/fixtures/path2`,
 +        ]);
 +        expectAsync(testJasmine.loadSpecs()).toBeRejectedWithError(Error,
 +            'Catch this error to ensure this file is loaded');
 +    });
 +
 +    it('does not bail out altogether if one of the specs has a syntax error', function () {
 +        testJasmine.addSpecFiles([`${testDir}/fixtures/syntaxErrorSpec.js`]);
-         expect(() => testJasmine.loadSpecs()).not.toThrow();
++        expectAsync(testJasmine.loadSpecs()).toBeResolved();
 +    });
 +
 +    it('does not bail out altogether if one of the specs does not exist', function () {
 +        testJasmine.addSpecFiles(['non/existent/file.js']);
++        expectAsync(testJasmine.loadSpecs()).toBeResolved();
 +    });
 +});